浏览代码

Merge branch 'master' into for-linus

Rafael J. Wysocki 16 年之前
父节点
当前提交
b4093d6235
共有 100 个文件被更改,包括 727 次插入455 次删除
  1. 1 1
      CREDITS
  2. 6 1
      Documentation/RCU/rculist_nulls.txt
  3. 2 2
      Documentation/connector/cn_test.c
  4. 1 1
      Documentation/connector/ucon.c
  5. 1 1
      Documentation/networking/6pack.txt
  6. 5 0
      Documentation/sound/alsa/Procfile.txt
  7. 1 1
      Documentation/video4linux/CARDLIST.em28xx
  8. 32 0
      Documentation/video4linux/gspca.txt
  9. 9 2
      MAINTAINERS
  10. 1 1
      Makefile
  11. 2 2
      arch/alpha/include/asm/tlb.h
  12. 2 2
      arch/arm/include/asm/tlb.h
  13. 1 1
      arch/avr32/include/asm/pgalloc.h
  14. 1 1
      arch/cris/include/asm/pgalloc.h
  15. 2 2
      arch/frv/include/asm/pgalloc.h
  16. 1 1
      arch/frv/include/asm/pgtable.h
  17. 3 3
      arch/ia64/include/asm/pgalloc.h
  18. 6 6
      arch/ia64/include/asm/tlb.h
  19. 2 2
      arch/m32r/include/asm/pgalloc.h
  20. 4 2
      arch/m68k/include/asm/motorola_pgalloc.h
  21. 2 2
      arch/m68k/include/asm/sun3_pgalloc.h
  22. 18 17
      arch/microblaze/Makefile
  23. 0 1
      arch/microblaze/include/asm/io.h
  24. 2 2
      arch/microblaze/include/asm/pgalloc.h
  25. 3 3
      arch/microblaze/include/asm/pgtable.h
  26. 13 10
      arch/microblaze/include/asm/prom.h
  27. 1 1
      arch/microblaze/include/asm/tlb.h
  28. 1 1
      arch/microblaze/include/asm/uaccess.h
  29. 1 1
      arch/microblaze/kernel/Makefile
  30. 1 1
      arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c
  31. 1 1
      arch/microblaze/kernel/cpu/cpuinfo-static.c
  32. 2 0
      arch/microblaze/kernel/cpu/cpuinfo.c
  33. 13 4
      arch/microblaze/kernel/head.S
  34. 46 63
      arch/microblaze/kernel/hw_exception_handler.S
  35. 14 5
      arch/microblaze/kernel/module.c
  36. 6 2
      arch/microblaze/kernel/setup.c
  37. 0 99
      arch/microblaze/kernel/sys_microblaze.c
  38. 1 1
      arch/microblaze/kernel/syscall_table.S
  39. 5 10
      arch/microblaze/mm/fault.c
  40. 2 13
      arch/mips/include/asm/pgalloc.h
  41. 1 1
      arch/mn10300/include/asm/pgalloc.h
  42. 2 2
      arch/parisc/include/asm/tlb.h
  43. 1 1
      arch/powerpc/include/asm/pgalloc-32.h
  44. 2 2
      arch/powerpc/include/asm/pgalloc-64.h
  45. 3 3
      arch/powerpc/include/asm/pgalloc.h
  46. 2 2
      arch/powerpc/mm/hugetlbpage.c
  47. 6 3
      arch/s390/include/asm/tlb.h
  48. 2 2
      arch/s390/kernel/early.c
  49. 4 3
      arch/s390/kernel/smp.c
  50. 9 2
      arch/s390/kernel/vdso64/clock_gettime.S
  51. 24 12
      arch/s390/power/swsusp.c
  52. 9 26
      arch/s390/power/swsusp_asm64.S
  53. 1 9
      arch/sh/include/asm/pgalloc.h
  54. 3 3
      arch/sh/include/asm/tlb.h
  55. 4 4
      arch/sparc/include/asm/pgalloc_32.h
  56. 3 3
      arch/sparc/include/asm/tlb_64.h
  57. 2 2
      arch/um/include/asm/pgalloc.h
  58. 3 3
      arch/um/include/asm/tlb.h
  59. 22 3
      arch/x86/include/asm/pgalloc.h
  60. 2 2
      arch/x86/include/asm/uaccess.h
  61. 5 5
      arch/x86/include/asm/uaccess_64.h
  62. 1 1
      arch/x86/kernel/cpu/amd.c
  63. 2 4
      arch/x86/kernel/cpu/mcheck/mce.c
  64. 233 20
      arch/x86/kernel/cpu/perf_counter.c
  65. 1 1
      arch/x86/kernel/irqinit.c
  66. 1 1
      arch/x86/kernel/mfgpt_32.c
  67. 8 0
      arch/x86/kernel/reboot.c
  68. 13 0
      arch/x86/kernel/setup.c
  69. 0 7
      arch/x86/kernel/vmlinux.lds.S
  70. 3 3
      arch/x86/mm/pgtable.c
  71. 4 2
      arch/x86/mm/srat_64.c
  72. 1 1
      arch/xtensa/include/asm/tlb.h
  73. 6 5
      block/blk-sysfs.c
  74. 9 4
      block/elevator.c
  75. 1 1
      drivers/block/ataflop.c
  76. 6 1
      drivers/block/virtio_blk.c
  77. 1 1
      drivers/block/z2ram.c
  78. 2 0
      drivers/char/pty.c
  79. 1 1
      drivers/connector/cn_queue.c
  80. 2 2
      drivers/connector/connector.c
  81. 1 1
      drivers/edac/amd64_edac.c
  82. 4 2
      drivers/hid/hid-core.c
  83. 3 1
      drivers/hid/usbhid/hiddev.c
  84. 5 1
      drivers/hwmon/asus_atk0110.c
  85. 11 0
      drivers/hwmon/smsc47m1.c
  86. 10 7
      drivers/i2c/chips/tsl2550.c
  87. 1 0
      drivers/ide/ide-disk.c
  88. 1 0
      drivers/ide/ide-tape.c
  89. 1 2
      drivers/input/evdev.c
  90. 1 1
      drivers/input/joydev.c
  91. 13 13
      drivers/input/joystick/xpad.c
  92. 32 0
      drivers/input/keyboard/atkbd.c
  93. 6 2
      drivers/input/misc/pcspkr.c
  94. 9 0
      drivers/input/misc/wistron_btns.c
  95. 2 2
      drivers/isdn/mISDN/l1oip_core.c
  96. 1 1
      drivers/md/dm-crypt.c
  97. 2 2
      drivers/md/dm-delay.c
  98. 1 1
      drivers/md/dm-linear.c
  99. 1 1
      drivers/md/dm-mpath.c
  100. 2 1
      drivers/md/dm-raid1.c

+ 1 - 1
CREDITS

@@ -1856,7 +1856,7 @@ E: rfkoenig@immd4.informatik.uni-erlangen.de
 D: The Linux Support Team Erlangen
 D: The Linux Support Team Erlangen
 
 
 N: Andreas Koensgen
 N: Andreas Koensgen
-E: ajk@iehk.rwth-aachen.de
+E: ajk@comnets.uni-bremen.de
 D: 6pack driver for AX.25
 D: 6pack driver for AX.25
 
 
 N: Harald Koerfgen
 N: Harald Koerfgen

+ 6 - 1
Documentation/RCU/rculist_nulls.txt

@@ -83,11 +83,12 @@ not detect it missed following items in original chain.
 obj = kmem_cache_alloc(...);
 obj = kmem_cache_alloc(...);
 lock_chain(); // typically a spin_lock()
 lock_chain(); // typically a spin_lock()
 obj->key = key;
 obj->key = key;
-atomic_inc(&obj->refcnt);
 /*
 /*
  * we need to make sure obj->key is updated before obj->next
  * we need to make sure obj->key is updated before obj->next
+ * or obj->refcnt
  */
  */
 smp_wmb();
 smp_wmb();
+atomic_set(&obj->refcnt, 1);
 hlist_add_head_rcu(&obj->obj_node, list);
 hlist_add_head_rcu(&obj->obj_node, list);
 unlock_chain(); // typically a spin_unlock()
 unlock_chain(); // typically a spin_unlock()
 
 
@@ -159,6 +160,10 @@ out:
 obj = kmem_cache_alloc(cachep);
 obj = kmem_cache_alloc(cachep);
 lock_chain(); // typically a spin_lock()
 lock_chain(); // typically a spin_lock()
 obj->key = key;
 obj->key = key;
+/*
+ * changes to obj->key must be visible before refcnt one
+ */
+smp_wmb();
 atomic_set(&obj->refcnt, 1);
 atomic_set(&obj->refcnt, 1);
 /*
 /*
  * insert obj in RCU way (readers might be traversing chain)
  * insert obj in RCU way (readers might be traversing chain)

+ 2 - 2
Documentation/connector/cn_test.c

@@ -1,7 +1,7 @@
 /*
 /*
  * 	cn_test.c
  * 	cn_test.c
  * 
  * 
- * 2004-2005 Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
+ * 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>
  * All rights reserved.
  * All rights reserved.
  * 
  * 
  * This program is free software; you can redistribute it and/or modify
  * This program is free software; you can redistribute it and/or modify
@@ -194,5 +194,5 @@ module_init(cn_test_init);
 module_exit(cn_test_fini);
 module_exit(cn_test_fini);
 
 
 MODULE_LICENSE("GPL");
 MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>");
+MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
 MODULE_DESCRIPTION("Connector's test module");
 MODULE_DESCRIPTION("Connector's test module");

+ 1 - 1
Documentation/connector/ucon.c

@@ -1,7 +1,7 @@
 /*
 /*
  * 	ucon.c
  * 	ucon.c
  *
  *
- * Copyright (c) 2004+ Evgeniy Polyakov <johnpol@2ka.mipt.ru>
+ * Copyright (c) 2004+ Evgeniy Polyakov <zbr@ioremap.net>
  *
  *
  *
  *
  * This program is free software; you can redistribute it and/or modify
  * This program is free software; you can redistribute it and/or modify

+ 1 - 1
Documentation/networking/6pack.txt

@@ -1,7 +1,7 @@
 This is the 6pack-mini-HOWTO, written by
 This is the 6pack-mini-HOWTO, written by
 
 
 Andreas Könsgen DG3KQ
 Andreas Könsgen DG3KQ
-Internet: ajk@iehk.rwth-aachen.de
+Internet: ajk@comnets.uni-bremen.de
 AMPR-net: dg3kq@db0pra.ampr.org
 AMPR-net: dg3kq@db0pra.ampr.org
 AX.25:    dg3kq@db0ach.#nrw.deu.eu
 AX.25:    dg3kq@db0ach.#nrw.deu.eu
 
 

+ 5 - 0
Documentation/sound/alsa/Procfile.txt

@@ -101,6 +101,8 @@ card*/pcm*/xrun_debug
 	  bit 0 = Enable XRUN/jiffies debug messages
 	  bit 0 = Enable XRUN/jiffies debug messages
 	  bit 1 = Show stack trace at XRUN / jiffies check
 	  bit 1 = Show stack trace at XRUN / jiffies check
 	  bit 2 = Enable additional jiffies check
 	  bit 2 = Enable additional jiffies check
+	  bit 3 = Log hwptr update at each period interrupt
+	  bit 4 = Log hwptr update at each snd_pcm_update_hw_ptr()
 
 
 	When the bit 0 is set, the driver will show the messages to
 	When the bit 0 is set, the driver will show the messages to
 	kernel log when an xrun is detected.  The debug message is
 	kernel log when an xrun is detected.  The debug message is
@@ -117,6 +119,9 @@ card*/pcm*/xrun_debug
 	buggy) hardware that doesn't give smooth pointer updates.
 	buggy) hardware that doesn't give smooth pointer updates.
 	This feature is enabled via the bit 2.
 	This feature is enabled via the bit 2.
 
 
+	Bits 3 and 4 are for logging the hwptr records.  Note that
+	these will give flood of kernel messages.
+
 card*/pcm*/sub*/info
 card*/pcm*/sub*/info
 	The general information of this PCM sub-stream.
 	The general information of this PCM sub-stream.
 
 

+ 1 - 1
Documentation/video4linux/CARDLIST.em28xx

@@ -20,7 +20,7 @@
  19 -> EM2860/SAA711X Reference Design          (em2860)
  19 -> EM2860/SAA711X Reference Design          (em2860)
  20 -> AMD ATI TV Wonder HD 600                 (em2880)        [0438:b002]
  20 -> AMD ATI TV Wonder HD 600                 (em2880)        [0438:b002]
  21 -> eMPIA Technology, Inc. GrabBeeX+ Video Encoder (em2800)        [eb1a:2801]
  21 -> eMPIA Technology, Inc. GrabBeeX+ Video Encoder (em2800)        [eb1a:2801]
- 22 -> Unknown EM2750/EM2751 webcam grabber     (em2750)        [eb1a:2750,eb1a:2751]
+ 22 -> EM2710/EM2750/EM2751 webcam grabber      (em2750)        [eb1a:2750,eb1a:2751]
  23 -> Huaqi DLCW-130                           (em2750)
  23 -> Huaqi DLCW-130                           (em2750)
  24 -> D-Link DUB-T210 TV Tuner                 (em2820/em2840) [2001:f112]
  24 -> D-Link DUB-T210 TV Tuner                 (em2820/em2840) [2001:f112]
  25 -> Gadmei UTV310                            (em2820/em2840)
  25 -> Gadmei UTV310                            (em2820/em2840)

+ 32 - 0
Documentation/video4linux/gspca.txt

@@ -44,7 +44,9 @@ zc3xx		0458:7007	Genius VideoCam V2
 zc3xx		0458:700c	Genius VideoCam V3
 zc3xx		0458:700c	Genius VideoCam V3
 zc3xx		0458:700f	Genius VideoCam Web V2
 zc3xx		0458:700f	Genius VideoCam Web V2
 sonixj		0458:7025	Genius Eye 311Q
 sonixj		0458:7025	Genius Eye 311Q
+sn9c20x		0458:7029	Genius Look 320s
 sonixj		0458:702e	Genius Slim 310 NB
 sonixj		0458:702e	Genius Slim 310 NB
+sn9c20x		045e:00f4	LifeCam VX-6000 (SN9C20x + OV9650)
 sonixj		045e:00f5	MicroSoft VX3000
 sonixj		045e:00f5	MicroSoft VX3000
 sonixj		045e:00f7	MicroSoft VX1000
 sonixj		045e:00f7	MicroSoft VX1000
 ov519		045e:028c	Micro$oft xbox cam
 ov519		045e:028c	Micro$oft xbox cam
@@ -282,6 +284,28 @@ sonixj		0c45:613a	Microdia Sonix PC Camera
 sonixj		0c45:613b	Surfer SN-206
 sonixj		0c45:613b	Surfer SN-206
 sonixj		0c45:613c	Sonix Pccam168
 sonixj		0c45:613c	Sonix Pccam168
 sonixj		0c45:6143	Sonix Pccam168
 sonixj		0c45:6143	Sonix Pccam168
+sn9c20x		0c45:6240	PC Camera (SN9C201 + MT9M001)
+sn9c20x		0c45:6242	PC Camera (SN9C201 + MT9M111)
+sn9c20x		0c45:6248	PC Camera (SN9C201 + OV9655)
+sn9c20x		0c45:624e	PC Camera (SN9C201 + SOI968)
+sn9c20x		0c45:624f	PC Camera (SN9C201 + OV9650)
+sn9c20x		0c45:6251	PC Camera (SN9C201 + OV9650)
+sn9c20x		0c45:6253	PC Camera (SN9C201 + OV9650)
+sn9c20x		0c45:6260	PC Camera (SN9C201 + OV7670)
+sn9c20x		0c45:6270	PC Camera (SN9C201 + MT9V011/MT9V111/MT9V112)
+sn9c20x		0c45:627b	PC Camera (SN9C201 + OV7660)
+sn9c20x		0c45:627c	PC Camera (SN9C201 + HV7131R)
+sn9c20x		0c45:627f	PC Camera (SN9C201 + OV9650)
+sn9c20x		0c45:6280	PC Camera (SN9C202 + MT9M001)
+sn9c20x		0c45:6282	PC Camera (SN9C202 + MT9M111)
+sn9c20x		0c45:6288	PC Camera (SN9C202 + OV9655)
+sn9c20x		0c45:628e	PC Camera (SN9C202 + SOI968)
+sn9c20x		0c45:628f	PC Camera (SN9C202 + OV9650)
+sn9c20x		0c45:62a0	PC Camera (SN9C202 + OV7670)
+sn9c20x		0c45:62b0	PC Camera (SN9C202 + MT9V011/MT9V111/MT9V112)
+sn9c20x		0c45:62b3	PC Camera (SN9C202 + OV9655)
+sn9c20x		0c45:62bb	PC Camera (SN9C202 + OV7660)
+sn9c20x		0c45:62bc	PC Camera (SN9C202 + HV7131R)
 sunplus		0d64:0303	Sunplus FashionCam DXG
 sunplus		0d64:0303	Sunplus FashionCam DXG
 etoms		102c:6151	Qcam Sangha CIF
 etoms		102c:6151	Qcam Sangha CIF
 etoms		102c:6251	Qcam xxxxxx VGA
 etoms		102c:6251	Qcam xxxxxx VGA
@@ -290,6 +314,7 @@ spca561		10fd:7e50	FlyCam Usb 100
 zc3xx		10fd:8050	Typhoon Webshot II USB 300k
 zc3xx		10fd:8050	Typhoon Webshot II USB 300k
 ov534		1415:2000	Sony HD Eye for PS3 (SLEH 00201)
 ov534		1415:2000	Sony HD Eye for PS3 (SLEH 00201)
 pac207		145f:013a	Trust WB-1300N
 pac207		145f:013a	Trust WB-1300N
+sn9c20x		145f:013d	Trust WB-3600R
 vc032x		15b8:6001	HP 2.0 Megapixel
 vc032x		15b8:6001	HP 2.0 Megapixel
 vc032x		15b8:6002	HP 2.0 Megapixel rz406aa
 vc032x		15b8:6002	HP 2.0 Megapixel rz406aa
 spca501		1776:501c	Arowana 300K CMOS Camera
 spca501		1776:501c	Arowana 300K CMOS Camera
@@ -300,4 +325,11 @@ spca500		2899:012c	Toptro Industrial
 spca508		8086:0110	Intel Easy PC Camera
 spca508		8086:0110	Intel Easy PC Camera
 spca500		8086:0630	Intel Pocket PC Camera
 spca500		8086:0630	Intel Pocket PC Camera
 spca506		99fa:8988	Grandtec V.cap
 spca506		99fa:8988	Grandtec V.cap
+sn9c20x		a168:0610	Dino-Lite Digital Microscope (SN9C201 + HV7131R)
+sn9c20x		a168:0611	Dino-Lite Digital Microscope (SN9C201 + HV7131R)
+sn9c20x		a168:0613	Dino-Lite Digital Microscope (SN9C201 + HV7131R)
+sn9c20x		a168:0618	Dino-Lite Digital Microscope (SN9C201 + HV7131R)
+sn9c20x		a168:0614	Dino-Lite Digital Microscope (SN9C201 + MT9M111)
+sn9c20x		a168:0615	Dino-Lite Digital Microscope (SN9C201 + MT9M111)
+sn9c20x		a168:0617	Dino-Lite Digital Microscope (SN9C201 + MT9M111)
 spca561		abcd:cdee	Petcam
 spca561		abcd:cdee	Petcam

+ 9 - 2
MAINTAINERS

@@ -150,7 +150,7 @@ F:	drivers/scsi/53c700*
 
 
 6PACK NETWORK DRIVER FOR AX.25
 6PACK NETWORK DRIVER FOR AX.25
 P:	Andreas Koensgen
 P:	Andreas Koensgen
-M:	ajk@iehk.rwth-aachen.de
+M:	ajk@comnets.uni-bremen.de
 L:	linux-hams@vger.kernel.org
 L:	linux-hams@vger.kernel.org
 S:	Maintained
 S:	Maintained
 F:	drivers/net/hamradio/6pack.c
 F:	drivers/net/hamradio/6pack.c
@@ -1612,6 +1612,13 @@ S:	Supported
 F:	fs/configfs/
 F:	fs/configfs/
 F:	include/linux/configfs.h
 F:	include/linux/configfs.h
 
 
+CONNECTOR
+P:	Evgeniy Polyakov
+M:	zbr@ioremap.net
+L:	netdev@vger.kernel.org
+S:	Maintained
+F:	drivers/connector/
+
 CONTROL GROUPS (CGROUPS)
 CONTROL GROUPS (CGROUPS)
 P:	Paul Menage
 P:	Paul Menage
 M:	menage@google.com
 M:	menage@google.com
@@ -4089,6 +4096,7 @@ L:	netfilter@vger.kernel.org
 L:	coreteam@netfilter.org
 L:	coreteam@netfilter.org
 W:	http://www.netfilter.org/
 W:	http://www.netfilter.org/
 W:	http://www.iptables.org/
 W:	http://www.iptables.org/
+T:	git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-2.6.git
 S:	Supported
 S:	Supported
 F:	include/linux/netfilter*
 F:	include/linux/netfilter*
 F:	include/linux/netfilter/
 F:	include/linux/netfilter/
@@ -5586,7 +5594,6 @@ S:	Odd Fixes
 F:	drivers/net/starfire*
 F:	drivers/net/starfire*
 
 
 STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
 STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
-W:	http://mosquitonet.Stanford.EDU/strip.html
 S:	Orphan
 S:	Orphan
 F:	drivers/net/wireless/strip.c
 F:	drivers/net/wireless/strip.c
 F:	include/linux/if_strip.h
 F:	include/linux/if_strip.h

+ 1 - 1
Makefile

@@ -1,7 +1,7 @@
 VERSION = 2
 VERSION = 2
 PATCHLEVEL = 6
 PATCHLEVEL = 6
 SUBLEVEL = 31
 SUBLEVEL = 31
-EXTRAVERSION = -rc3
+EXTRAVERSION = -rc4
 NAME = Man-Eating Seals of Antiquity
 NAME = Man-Eating Seals of Antiquity
 
 
 # *DOCUMENTATION*
 # *DOCUMENTATION*

+ 2 - 2
arch/alpha/include/asm/tlb.h

@@ -9,7 +9,7 @@
 
 
 #include <asm-generic/tlb.h>
 #include <asm-generic/tlb.h>
 
 
-#define __pte_free_tlb(tlb, pte)			pte_free((tlb)->mm, pte)
-#define __pmd_free_tlb(tlb, pmd)			pmd_free((tlb)->mm, pmd)
+#define __pte_free_tlb(tlb, pte, address)		pte_free((tlb)->mm, pte)
+#define __pmd_free_tlb(tlb, pmd, address)		pmd_free((tlb)->mm, pmd)
  
  
 #endif
 #endif

+ 2 - 2
arch/arm/include/asm/tlb.h

@@ -102,8 +102,8 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
 }
 }
 
 
 #define tlb_remove_page(tlb,page)	free_page_and_swap_cache(page)
 #define tlb_remove_page(tlb,page)	free_page_and_swap_cache(page)
-#define pte_free_tlb(tlb, ptep)		pte_free((tlb)->mm, ptep)
-#define pmd_free_tlb(tlb, pmdp)		pmd_free((tlb)->mm, pmdp)
+#define pte_free_tlb(tlb, ptep, addr)	pte_free((tlb)->mm, ptep)
+#define pmd_free_tlb(tlb, pmdp, addr)	pmd_free((tlb)->mm, pmdp)
 
 
 #define tlb_migrate_finish(mm)		do { } while (0)
 #define tlb_migrate_finish(mm)		do { } while (0)
 
 

+ 1 - 1
arch/avr32/include/asm/pgalloc.h

@@ -83,7 +83,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
 	quicklist_free_page(QUICK_PT, NULL, pte);
 	quicklist_free_page(QUICK_PT, NULL, pte);
 }
 }
 
 
-#define __pte_free_tlb(tlb,pte)				\
+#define __pte_free_tlb(tlb,pte,addr)			\
 do {							\
 do {							\
 	pgtable_page_dtor(pte);				\
 	pgtable_page_dtor(pte);				\
 	tlb_remove_page((tlb), pte);			\
 	tlb_remove_page((tlb), pte);			\

+ 1 - 1
arch/cris/include/asm/pgalloc.h

@@ -47,7 +47,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
 	__free_page(pte);
 	__free_page(pte);
 }
 }
 
 
-#define __pte_free_tlb(tlb,pte)				\
+#define __pte_free_tlb(tlb,pte,address)			\
 do {							\
 do {							\
 	pgtable_page_dtor(pte);				\
 	pgtable_page_dtor(pte);				\
 	tlb_remove_page((tlb), pte);			\
 	tlb_remove_page((tlb), pte);			\

+ 2 - 2
arch/frv/include/asm/pgalloc.h

@@ -49,7 +49,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
 	__free_page(pte);
 	__free_page(pte);
 }
 }
 
 
-#define __pte_free_tlb(tlb,pte)				\
+#define __pte_free_tlb(tlb,pte,address)			\
 do {							\
 do {							\
 	pgtable_page_dtor(pte);				\
 	pgtable_page_dtor(pte);				\
 	tlb_remove_page((tlb),(pte));			\
 	tlb_remove_page((tlb),(pte));			\
@@ -62,7 +62,7 @@ do {							\
  */
  */
 #define pmd_alloc_one(mm, addr)		({ BUG(); ((pmd_t *) 2); })
 #define pmd_alloc_one(mm, addr)		({ BUG(); ((pmd_t *) 2); })
 #define pmd_free(mm, x)			do { } while (0)
 #define pmd_free(mm, x)			do { } while (0)
-#define __pmd_free_tlb(tlb,x)		do { } while (0)
+#define __pmd_free_tlb(tlb,x,a)		do { } while (0)
 
 
 #endif /* CONFIG_MMU */
 #endif /* CONFIG_MMU */
 
 

+ 1 - 1
arch/frv/include/asm/pgtable.h

@@ -225,7 +225,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
  */
  */
 #define pud_alloc_one(mm, address)		NULL
 #define pud_alloc_one(mm, address)		NULL
 #define pud_free(mm, x)				do { } while (0)
 #define pud_free(mm, x)				do { } while (0)
-#define __pud_free_tlb(tlb, x)			do { } while (0)
+#define __pud_free_tlb(tlb, x, address)		do { } while (0)
 
 
 /*
 /*
  * The "pud_xxx()" functions here are trivial for a folded two-level
  * The "pud_xxx()" functions here are trivial for a folded two-level

+ 3 - 3
arch/ia64/include/asm/pgalloc.h

@@ -48,7 +48,7 @@ static inline void pud_free(struct mm_struct *mm, pud_t *pud)
 {
 {
 	quicklist_free(0, NULL, pud);
 	quicklist_free(0, NULL, pud);
 }
 }
-#define __pud_free_tlb(tlb, pud)	pud_free((tlb)->mm, pud)
+#define __pud_free_tlb(tlb, pud, address)	pud_free((tlb)->mm, pud)
 #endif /* CONFIG_PGTABLE_4 */
 #endif /* CONFIG_PGTABLE_4 */
 
 
 static inline void
 static inline void
@@ -67,7 +67,7 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
 	quicklist_free(0, NULL, pmd);
 	quicklist_free(0, NULL, pmd);
 }
 }
 
 
-#define __pmd_free_tlb(tlb, pmd)	pmd_free((tlb)->mm, pmd)
+#define __pmd_free_tlb(tlb, pmd, address)	pmd_free((tlb)->mm, pmd)
 
 
 static inline void
 static inline void
 pmd_populate(struct mm_struct *mm, pmd_t * pmd_entry, pgtable_t pte)
 pmd_populate(struct mm_struct *mm, pmd_t * pmd_entry, pgtable_t pte)
@@ -117,6 +117,6 @@ static inline void check_pgt_cache(void)
 	quicklist_trim(0, NULL, 25, 16);
 	quicklist_trim(0, NULL, 25, 16);
 }
 }
 
 
-#define __pte_free_tlb(tlb, pte)	pte_free((tlb)->mm, pte)
+#define __pte_free_tlb(tlb, pte, address)	pte_free((tlb)->mm, pte)
 
 
 #endif				/* _ASM_IA64_PGALLOC_H */
 #endif				/* _ASM_IA64_PGALLOC_H */

+ 6 - 6
arch/ia64/include/asm/tlb.h

@@ -236,22 +236,22 @@ do {							\
 	__tlb_remove_tlb_entry(tlb, ptep, addr);	\
 	__tlb_remove_tlb_entry(tlb, ptep, addr);	\
 } while (0)
 } while (0)
 
 
-#define pte_free_tlb(tlb, ptep)				\
+#define pte_free_tlb(tlb, ptep, address)		\
 do {							\
 do {							\
 	tlb->need_flush = 1;				\
 	tlb->need_flush = 1;				\
-	__pte_free_tlb(tlb, ptep);			\
+	__pte_free_tlb(tlb, ptep, address);		\
 } while (0)
 } while (0)
 
 
-#define pmd_free_tlb(tlb, ptep)				\
+#define pmd_free_tlb(tlb, ptep, address)		\
 do {							\
 do {							\
 	tlb->need_flush = 1;				\
 	tlb->need_flush = 1;				\
-	__pmd_free_tlb(tlb, ptep);			\
+	__pmd_free_tlb(tlb, ptep, address);		\
 } while (0)
 } while (0)
 
 
-#define pud_free_tlb(tlb, pudp)				\
+#define pud_free_tlb(tlb, pudp, address)		\
 do {							\
 do {							\
 	tlb->need_flush = 1;				\
 	tlb->need_flush = 1;				\
-	__pud_free_tlb(tlb, pudp);			\
+	__pud_free_tlb(tlb, pudp, address);		\
 } while (0)
 } while (0)
 
 
 #endif /* _ASM_IA64_TLB_H */
 #endif /* _ASM_IA64_TLB_H */

+ 2 - 2
arch/m32r/include/asm/pgalloc.h

@@ -58,7 +58,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
 	__free_page(pte);
 	__free_page(pte);
 }
 }
 
 
-#define __pte_free_tlb(tlb, pte)	pte_free((tlb)->mm, (pte))
+#define __pte_free_tlb(tlb, pte, addr)	pte_free((tlb)->mm, (pte))
 
 
 /*
 /*
  * allocating and freeing a pmd is trivial: the 1-entry pmd is
  * allocating and freeing a pmd is trivial: the 1-entry pmd is
@@ -68,7 +68,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
 
 
 #define pmd_alloc_one(mm, addr)		({ BUG(); ((pmd_t *)2); })
 #define pmd_alloc_one(mm, addr)		({ BUG(); ((pmd_t *)2); })
 #define pmd_free(mm, x)			do { } while (0)
 #define pmd_free(mm, x)			do { } while (0)
-#define __pmd_free_tlb(tlb, x)		do { } while (0)
+#define __pmd_free_tlb(tlb, x, addr)	do { } while (0)
 #define pgd_populate(mm, pmd, pte)	BUG()
 #define pgd_populate(mm, pmd, pte)	BUG()
 
 
 #define check_pgt_cache()	do { } while (0)
 #define check_pgt_cache()	do { } while (0)

+ 4 - 2
arch/m68k/include/asm/motorola_pgalloc.h

@@ -54,7 +54,8 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t page)
 	__free_page(page);
 	__free_page(page);
 }
 }
 
 
-static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page)
+static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page,
+				  unsigned long address)
 {
 {
 	pgtable_page_dtor(page);
 	pgtable_page_dtor(page);
 	cache_page(kmap(page));
 	cache_page(kmap(page));
@@ -73,7 +74,8 @@ static inline int pmd_free(struct mm_struct *mm, pmd_t *pmd)
 	return free_pointer_table(pmd);
 	return free_pointer_table(pmd);
 }
 }
 
 
-static inline int __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
+static inline int __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
+				 unsigned long address)
 {
 {
 	return free_pointer_table(pmd);
 	return free_pointer_table(pmd);
 }
 }

+ 2 - 2
arch/m68k/include/asm/sun3_pgalloc.h

@@ -32,7 +32,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t page)
         __free_page(page);
         __free_page(page);
 }
 }
 
 
-#define __pte_free_tlb(tlb,pte)				\
+#define __pte_free_tlb(tlb,pte,addr)			\
 do {							\
 do {							\
 	pgtable_page_dtor(pte);				\
 	pgtable_page_dtor(pte);				\
 	tlb_remove_page((tlb), pte);			\
 	tlb_remove_page((tlb), pte);			\
@@ -80,7 +80,7 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t page
  * inside the pgd, so has no extra memory associated with it.
  * inside the pgd, so has no extra memory associated with it.
  */
  */
 #define pmd_free(mm, x)			do { } while (0)
 #define pmd_free(mm, x)			do { } while (0)
-#define __pmd_free_tlb(tlb, x)		do { } while (0)
+#define __pmd_free_tlb(tlb, x, addr)	do { } while (0)
 
 
 static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
 static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
 {
 {

+ 18 - 17
arch/microblaze/Makefile

@@ -6,14 +6,16 @@ endif
 
 
 # What CPU vesion are we building for, and crack it open
 # What CPU vesion are we building for, and crack it open
 # as major.minor.rev
 # as major.minor.rev
-CPU_VER=$(subst ",,$(CONFIG_XILINX_MICROBLAZE0_HW_VER) )
-CPU_MAJOR=$(shell echo $(CPU_VER) | cut -d '.' -f 1)
-CPU_MINOR=$(shell echo $(CPU_VER) | cut -d '.' -f 2)
-CPU_REV=$(shell echo $(CPU_VER) | cut -d '.' -f 3)
+CPU_VER   := $(shell echo $(CONFIG_XILINX_MICROBLAZE0_HW_VER))
+CPU_MAJOR := $(shell echo $(CPU_VER) | cut -d '.' -f 1)
+CPU_MINOR := $(shell echo $(CPU_VER) | cut -d '.' -f 2)
+CPU_REV   := $(shell echo $(CPU_VER) | cut -d '.' -f 3)
 
 
 export CPU_VER CPU_MAJOR CPU_MINOR CPU_REV
 export CPU_VER CPU_MAJOR CPU_MINOR CPU_REV
 
 
 # Use cpu-related CONFIG_ vars to set compile options.
 # Use cpu-related CONFIG_ vars to set compile options.
+# The various CONFIG_XILINX cpu features options are integers 0/1/2...
+# rather than bools y/n
 
 
 # Work out HW multipler support.  This is icky.
 # Work out HW multipler support.  This is icky.
 # 1. Spartan2 has no HW multiplers.
 # 1. Spartan2 has no HW multiplers.
@@ -34,30 +36,29 @@ CPUFLAGS-$(CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR) += -mxl-pattern-compare
 
 
 CPUFLAGS-1 += $(call cc-option,-mcpu=v$(CPU_VER))
 CPUFLAGS-1 += $(call cc-option,-mcpu=v$(CPU_VER))
 
 
-# The various CONFIG_XILINX cpu features options are integers 0/1/2...
-# rather than bools y/n
-
 # r31 holds current when in kernel mode
 # r31 holds current when in kernel mode
-CFLAGS_KERNEL += -ffixed-r31 $(CPUFLAGS-1) $(CPUFLAGS-2)
+KBUILD_KERNEL += -ffixed-r31 $(CPUFLAGS-1) $(CPUFLAGS-2)
 
 
 LDFLAGS		:=
 LDFLAGS		:=
 LDFLAGS_vmlinux	:=
 LDFLAGS_vmlinux	:=
-LDFLAGS_BLOB := --format binary --oformat elf32-microblaze
 
 
-LIBGCC := $(shell $(CC) $(CFLAGS_KERNEL) -print-libgcc-file-name)
+LIBGCC := $(shell $(CC) $(KBUILD_KERNEL) -print-libgcc-file-name)
 
 
-head-y		:= arch/microblaze/kernel/head.o
-libs-y		+= arch/microblaze/lib/ $(LIBGCC)
-core-y		+= arch/microblaze/kernel/ arch/microblaze/mm/ \
-		   arch/microblaze/platform/
+head-y := arch/microblaze/kernel/head.o
+libs-y += arch/microblaze/lib/
+libs-y += $(LIBGCC)
+core-y += arch/microblaze/kernel/
+core-y += arch/microblaze/mm/
+core-y += arch/microblaze/platform/
 
 
-boot := arch/$(ARCH)/boot
+boot := arch/microblaze/boot
 
 
 # defines filename extension depending memory management type
 # defines filename extension depending memory management type
 ifeq ($(CONFIG_MMU),)
 ifeq ($(CONFIG_MMU),)
-MMUEXT		:= -nommu
+MMU := -nommu
 endif
 endif
-export	MMUEXT
+
+export MMU
 
 
 all: linux.bin
 all: linux.bin
 
 

+ 0 - 1
arch/microblaze/include/asm/io.h

@@ -14,7 +14,6 @@
 #include <asm/byteorder.h>
 #include <asm/byteorder.h>
 #include <asm/page.h>
 #include <asm/page.h>
 #include <linux/types.h>
 #include <linux/types.h>
-#include <asm/byteorder.h>
 #include <linux/mm.h>          /* Get struct page {...} */
 #include <linux/mm.h>          /* Get struct page {...} */
 
 
 
 

+ 2 - 2
arch/microblaze/include/asm/pgalloc.h

@@ -180,7 +180,7 @@ extern inline void pte_free(struct mm_struct *mm, struct page *ptepage)
 	__free_page(ptepage);
 	__free_page(ptepage);
 }
 }
 
 
-#define __pte_free_tlb(tlb, pte)	pte_free((tlb)->mm, (pte))
+#define __pte_free_tlb(tlb, pte, addr)	pte_free((tlb)->mm, (pte))
 
 
 #define pmd_populate(mm, pmd, pte)	(pmd_val(*(pmd)) = page_address(pte))
 #define pmd_populate(mm, pmd, pte)	(pmd_val(*(pmd)) = page_address(pte))
 
 
@@ -193,7 +193,7 @@ extern inline void pte_free(struct mm_struct *mm, struct page *ptepage)
  */
  */
 #define pmd_alloc_one(mm, address)	({ BUG(); ((pmd_t *)2); })
 #define pmd_alloc_one(mm, address)	({ BUG(); ((pmd_t *)2); })
 /*#define pmd_free(mm, x)			do { } while (0)*/
 /*#define pmd_free(mm, x)			do { } while (0)*/
-#define __pmd_free_tlb(tlb, x)		do { } while (0)
+#define __pmd_free_tlb(tlb, x, addr)	do { } while (0)
 #define pgd_populate(mm, pmd, pte)	BUG()
 #define pgd_populate(mm, pmd, pte)	BUG()
 
 
 extern int do_check_pgt_cache(int, int);
 extern int do_check_pgt_cache(int, int);

+ 3 - 3
arch/microblaze/include/asm/pgtable.h

@@ -185,6 +185,7 @@ static inline pte_t pte_mkspecial(pte_t pte)	{ return pte; }
 
 
 /* Definitions for MicroBlaze. */
 /* Definitions for MicroBlaze. */
 #define	_PAGE_GUARDED	0x001	/* G: page is guarded from prefetch */
 #define	_PAGE_GUARDED	0x001	/* G: page is guarded from prefetch */
+#define _PAGE_FILE	0x001	/* when !present: nonlinear file mapping */
 #define _PAGE_PRESENT	0x002	/* software: PTE contains a translation */
 #define _PAGE_PRESENT	0x002	/* software: PTE contains a translation */
 #define	_PAGE_NO_CACHE	0x004	/* I: caching is inhibited */
 #define	_PAGE_NO_CACHE	0x004	/* I: caching is inhibited */
 #define	_PAGE_WRITETHRU	0x008	/* W: caching is write-through */
 #define	_PAGE_WRITETHRU	0x008	/* W: caching is write-through */
@@ -320,8 +321,7 @@ static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; }
 static inline int pte_exec(pte_t pte)  { return pte_val(pte) & _PAGE_EXEC; }
 static inline int pte_exec(pte_t pte)  { return pte_val(pte) & _PAGE_EXEC; }
 static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
 static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
 static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
 static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
-/* FIXME */
-static inline int pte_file(pte_t pte)		{ return 0; }
+static inline int pte_file(pte_t pte)  { return pte_val(pte) & _PAGE_FILE; }
 
 
 static inline void pte_uncache(pte_t pte) { pte_val(pte) |= _PAGE_NO_CACHE; }
 static inline void pte_uncache(pte_t pte) { pte_val(pte) |= _PAGE_NO_CACHE; }
 static inline void pte_cache(pte_t pte)   { pte_val(pte) &= ~_PAGE_NO_CACHE; }
 static inline void pte_cache(pte_t pte)   { pte_val(pte) &= ~_PAGE_NO_CACHE; }
@@ -488,7 +488,7 @@ static inline pmd_t *pmd_offset(pgd_t *dir, unsigned long address)
 /* Encode and decode a nonlinear file mapping entry */
 /* Encode and decode a nonlinear file mapping entry */
 #define PTE_FILE_MAX_BITS	29
 #define PTE_FILE_MAX_BITS	29
 #define pte_to_pgoff(pte)	(pte_val(pte) >> 3)
 #define pte_to_pgoff(pte)	(pte_val(pte) >> 3)
-#define pgoff_to_pte(off)	((pte_t) { ((off) << 3) })
+#define pgoff_to_pte(off)	((pte_t) { ((off) << 3) | _PAGE_FILE })
 
 
 extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
 extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
 
 

+ 13 - 10
arch/microblaze/include/asm/prom.h

@@ -16,6 +16,18 @@
 #define _ASM_MICROBLAZE_PROM_H
 #define _ASM_MICROBLAZE_PROM_H
 #ifdef __KERNEL__
 #ifdef __KERNEL__
 
 
+/* Definitions used by the flattened device tree */
+#define OF_DT_HEADER		0xd00dfeed /* marker */
+#define OF_DT_BEGIN_NODE	0x1 /* Start of node, full name */
+#define OF_DT_END_NODE		0x2 /* End node */
+#define OF_DT_PROP		0x3 /* Property: name off, size, content */
+#define OF_DT_NOP		0x4 /* nop */
+#define OF_DT_END		0x9
+
+#define OF_DT_VERSION		0x10
+
+#ifndef __ASSEMBLY__
+
 #include <linux/types.h>
 #include <linux/types.h>
 #include <linux/proc_fs.h>
 #include <linux/proc_fs.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
@@ -29,16 +41,6 @@
 #define of_prop_cmp(s1, s2)		strcmp((s1), (s2))
 #define of_prop_cmp(s1, s2)		strcmp((s1), (s2))
 #define of_node_cmp(s1, s2)		strcasecmp((s1), (s2))
 #define of_node_cmp(s1, s2)		strcasecmp((s1), (s2))
 
 
-/* Definitions used by the flattened device tree */
-#define OF_DT_HEADER		0xd00dfeed /* marker */
-#define OF_DT_BEGIN_NODE	0x1 /* Start of node, full name */
-#define OF_DT_END_NODE		0x2 /* End node */
-#define OF_DT_PROP		0x3 /* Property: name off, size, content */
-#define OF_DT_NOP		0x4 /* nop */
-#define OF_DT_END		0x9
-
-#define OF_DT_VERSION		0x10
-
 /*
 /*
  * This is what gets passed to the kernel by prom_init or kexec
  * This is what gets passed to the kernel by prom_init or kexec
  *
  *
@@ -309,5 +311,6 @@ extern void __iomem *of_iomap(struct device_node *device, int index);
  */
  */
 #include <linux/of.h>
 #include <linux/of.h>
 
 
+#endif /* __ASSEMBLY__ */
 #endif /* __KERNEL__ */
 #endif /* __KERNEL__ */
 #endif /* _ASM_MICROBLAZE_PROM_H */
 #endif /* _ASM_MICROBLAZE_PROM_H */

+ 1 - 1
arch/microblaze/include/asm/tlb.h

@@ -11,7 +11,7 @@
 #ifndef _ASM_MICROBLAZE_TLB_H
 #ifndef _ASM_MICROBLAZE_TLB_H
 #define _ASM_MICROBLAZE_TLB_H
 #define _ASM_MICROBLAZE_TLB_H
 
 
-#define tlb_flush(tlb)	do {} while (0)
+#define tlb_flush(tlb)	flush_tlb_mm((tlb)->mm)
 
 
 #include <asm-generic/tlb.h>
 #include <asm-generic/tlb.h>
 
 

+ 1 - 1
arch/microblaze/include/asm/uaccess.h

@@ -189,7 +189,7 @@ extern long strnlen_user(const char *src, long count);
 
 
 #define __put_user(x, ptr)						\
 #define __put_user(x, ptr)						\
 ({									\
 ({									\
-	__typeof__(*(ptr)) __gu_val = x;				\
+	__typeof__(*(ptr)) volatile __gu_val = (x);			\
 	long __gu_err = 0;						\
 	long __gu_err = 0;						\
 	switch (sizeof(__gu_val)) {					\
 	switch (sizeof(__gu_val)) {					\
 	case 1:								\
 	case 1:								\

+ 1 - 1
arch/microblaze/kernel/Makefile

@@ -17,4 +17,4 @@ obj-$(CONFIG_HEART_BEAT)	+= heartbeat.o
 obj-$(CONFIG_MODULES)		+= microblaze_ksyms.o module.o
 obj-$(CONFIG_MODULES)		+= microblaze_ksyms.o module.o
 obj-$(CONFIG_MMU)		+= misc.o
 obj-$(CONFIG_MMU)		+= misc.o
 
 
-obj-y	+= entry$(MMUEXT).o
+obj-y	+= entry$(MMU).o

+ 1 - 1
arch/microblaze/kernel/cpu/cpuinfo-pvr-full.c

@@ -22,7 +22,7 @@
 
 
 #define CI(c, p) { ci->c = PVR_##p(pvr); }
 #define CI(c, p) { ci->c = PVR_##p(pvr); }
 #define err_printk(x) \
 #define err_printk(x) \
-	early_printk("ERROR: Microblaze " x " - different for PVR and DTS\n");
+	early_printk("ERROR: Microblaze " x "-different for PVR and DTS\n");
 
 
 void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu)
 void set_cpuinfo_pvr_full(struct cpuinfo *ci, struct device_node *cpu)
 {
 {

+ 1 - 1
arch/microblaze/kernel/cpu/cpuinfo-static.c

@@ -18,7 +18,7 @@ static const char family_string[] = CONFIG_XILINX_MICROBLAZE0_FAMILY;
 static const char cpu_ver_string[] = CONFIG_XILINX_MICROBLAZE0_HW_VER;
 static const char cpu_ver_string[] = CONFIG_XILINX_MICROBLAZE0_HW_VER;
 
 
 #define err_printk(x) \
 #define err_printk(x) \
-	early_printk("ERROR: Microblaze " x "- different for kernel and DTS\n");
+	early_printk("ERROR: Microblaze " x "-different for kernel and DTS\n");
 
 
 void __init set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu)
 void __init set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu)
 {
 {

+ 2 - 0
arch/microblaze/kernel/cpu/cpuinfo.c

@@ -26,6 +26,8 @@ const struct cpu_ver_key cpu_ver_lookup[] = {
 	{"7.10.b", 0x09},
 	{"7.10.b", 0x09},
 	{"7.10.c", 0x0a},
 	{"7.10.c", 0x0a},
 	{"7.10.d", 0x0b},
 	{"7.10.d", 0x0b},
+	{"7.20.a", 0x0c},
+	{"7.20.b", 0x0d},
 	/* FIXME There is no keycode defined in MBV for these versions */
 	/* FIXME There is no keycode defined in MBV for these versions */
 	{"2.10.a", 0x10},
 	{"2.10.a", 0x10},
 	{"3.00.a", 0x20},
 	{"3.00.a", 0x20},

+ 13 - 4
arch/microblaze/kernel/head.S

@@ -31,6 +31,7 @@
 #include <linux/linkage.h>
 #include <linux/linkage.h>
 #include <asm/thread_info.h>
 #include <asm/thread_info.h>
 #include <asm/page.h>
 #include <asm/page.h>
+#include <asm/prom.h>		/* for OF_DT_HEADER */
 
 
 #ifdef CONFIG_MMU
 #ifdef CONFIG_MMU
 #include <asm/setup.h> /* COMMAND_LINE_SIZE */
 #include <asm/setup.h> /* COMMAND_LINE_SIZE */
@@ -54,11 +55,19 @@ ENTRY(_start)
 	andi	r1, r1, ~2
 	andi	r1, r1, ~2
 	mts	rmsr, r1
 	mts	rmsr, r1
 
 
-/* save fdt to kernel location */
-/* r7 stores pointer to fdt blob */
-	beqi	r7, no_fdt_arg
+/* r7 may point to an FDT, or there may be one linked in.
+   if it's in r7, we've got to save it away ASAP.
+   We ensure r7 points to a valid FDT, just in case the bootloader
+   is broken or non-existent */
+	beqi	r7, no_fdt_arg			/* NULL pointer?  don't copy */
+	lw	r11, r0, r7			/* Does r7 point to a */
+	rsubi	r11, r11, OF_DT_HEADER		/* valid FDT? */
+	beqi	r11, _prepare_copy_fdt
+	or	r7, r0, r0		/* clear R7 when not valid DTB */
+	bnei	r11, no_fdt_arg			/* No - get out of here */
+_prepare_copy_fdt:
 	or	r11, r0, r0 /* incremment */
 	or	r11, r0, r0 /* incremment */
-	ori	r4, r0, TOPHYS(_fdt_start) /* save bram context */
+	ori	r4, r0, TOPHYS(_fdt_start)
 	ori	r3, r0, (0x4000 - 4)
 	ori	r3, r0, (0x4000 - 4)
 _copy_fdt:
 _copy_fdt:
 	lw	r12, r7, r11 /* r12 = r7 + r11 */
 	lw	r12, r7, r11 /* r12 = r7 + r11 */

+ 46 - 63
arch/microblaze/kernel/hw_exception_handler.S

@@ -74,6 +74,7 @@
 
 
 #include <asm/mmu.h>
 #include <asm/mmu.h>
 #include <asm/pgtable.h>
 #include <asm/pgtable.h>
+#include <asm/signal.h>
 #include <asm/asm-offsets.h>
 #include <asm/asm-offsets.h>
 
 
 /* Helpful Macros */
 /* Helpful Macros */
@@ -428,19 +429,9 @@ handle_unaligned_ex:
 	mfs	r17, rbtr;	/* ESR[DS] set - return address in BTR */
 	mfs	r17, rbtr;	/* ESR[DS] set - return address in BTR */
 	nop
 	nop
 _no_delayslot:
 _no_delayslot:
-#endif
-
-#ifdef CONFIG_MMU
-	/* Check if unaligned address is last on a 4k page */
-		andi	r5, r4, 0xffc
-		xori	r5, r5, 0xffc
-		bnei	r5, _unaligned_ex2
-	_unaligned_ex1:
-		RESTORE_STATE;
-/* Another page must be accessed or physical address not in page table */
-		bri	unaligned_data_trap
-
-	_unaligned_ex2:
+	/* jump to high level unaligned handler */
+	RESTORE_STATE;
+	bri	unaligned_data_trap
 #endif
 #endif
 	andi	r6, r3, 0x3E0; /* Mask and extract the register operand */
 	andi	r6, r3, 0x3E0; /* Mask and extract the register operand */
 	srl	r6, r6; /* r6 >> 5 */
 	srl	r6, r6; /* r6 >> 5 */
@@ -450,45 +441,6 @@ _no_delayslot:
 	srl	r6, r6;
 	srl	r6, r6;
 	/* Store the register operand in a temporary location */
 	/* Store the register operand in a temporary location */
 	sbi	r6, r0, TOPHYS(ex_reg_op);
 	sbi	r6, r0, TOPHYS(ex_reg_op);
-#ifdef CONFIG_MMU
-	/* Get physical address */
-	/* If we are faulting a kernel address, we have to use the
-	 * kernel page tables.
-	 */
-	ori	r5, r0, CONFIG_KERNEL_START
-	cmpu	r5, r4, r5
-	bgti	r5, _unaligned_ex3
-	ori	r5, r0, swapper_pg_dir
-	bri	_unaligned_ex4
-
-	/* Get the PGD for the current thread. */
-_unaligned_ex3: /* user thread */
-	addi	r5 ,CURRENT_TASK, TOPHYS(0); /* get current task address */
-	lwi	r5, r5, TASK_THREAD + PGDIR
-_unaligned_ex4:
-	tophys(r5,r5)
-	BSRLI(r6,r4,20)			/* Create L1 (pgdir/pmd) address */
-	andi	r6, r6, 0xffc
-/* Assume pgdir aligned on 4K boundary, no need for "andi r5,r5,0xfffff003" */
-	or	r5, r5, r6
-	lwi	r6, r5, 0		/* Get L1 entry */
-	andi	r5, r6, 0xfffff000	/* Extract L2 (pte) base address. */
-	beqi	r5, _unaligned_ex1	/* Bail if no table */
-
-	tophys(r5,r5)
-	BSRLI(r6,r4,10)			/* Compute PTE address */
-	andi	r6, r6, 0xffc
-	andi	r5, r5, 0xfffff003
-	or	r5, r5, r6
-	lwi	r5, r5, 0		/* Get Linux PTE */
-
-	andi	r6, r5, _PAGE_PRESENT
-	beqi	r6, _unaligned_ex1	/* Bail if no page */
-
-	andi	r5, r5, 0xfffff000	/* Extract RPN */
-	andi	r4, r4, 0x00000fff	/* Extract offset */
-	or	r4, r4, r5		/* Create physical address */
-#endif /* CONFIG_MMU */
 
 
 	andi	r6, r3, 0x400; /* Extract ESR[S] */
 	andi	r6, r3, 0x400; /* Extract ESR[S] */
 	bnei	r6, ex_sw;
 	bnei	r6, ex_sw;
@@ -959,15 +911,15 @@ _unaligned_data_exception:
 	andi	r6, r3, 0x800;	/* Extract ESR[W] - delay slot */
 	andi	r6, r3, 0x800;	/* Extract ESR[W] - delay slot */
 ex_lw_vm:
 ex_lw_vm:
 	beqid	r6, ex_lhw_vm;
 	beqid	r6, ex_lhw_vm;
-	lbui	r5, r4, 0;	/* Exception address in r4 - delay slot */
+load1:	lbui	r5, r4, 0;	/* Exception address in r4 - delay slot */
 /* Load a word, byte-by-byte from destination address and save it in tmp space*/
 /* Load a word, byte-by-byte from destination address and save it in tmp space*/
 	la	r6, r0, ex_tmp_data_loc_0;
 	la	r6, r0, ex_tmp_data_loc_0;
 	sbi	r5, r6, 0;
 	sbi	r5, r6, 0;
-	lbui	r5, r4, 1;
+load2:	lbui	r5, r4, 1;
 	sbi	r5, r6, 1;
 	sbi	r5, r6, 1;
-	lbui	r5, r4, 2;
+load3:	lbui	r5, r4, 2;
 	sbi	r5, r6, 2;
 	sbi	r5, r6, 2;
-	lbui	r5, r4, 3;
+load4:	lbui	r5, r4, 3;
 	sbi	r5, r6, 3;
 	sbi	r5, r6, 3;
 	brid	ex_lw_tail_vm;
 	brid	ex_lw_tail_vm;
 /* Get the destination register value into r3 - delay slot */
 /* Get the destination register value into r3 - delay slot */
@@ -977,7 +929,7 @@ ex_lhw_vm:
 	 * save it in tmp space */
 	 * save it in tmp space */
 	la	r6, r0, ex_tmp_data_loc_0;
 	la	r6, r0, ex_tmp_data_loc_0;
 	sbi	r5, r6, 0;
 	sbi	r5, r6, 0;
-	lbui	r5, r4, 1;
+load5:	lbui	r5, r4, 1;
 	sbi	r5, r6, 1;
 	sbi	r5, r6, 1;
 	lhui	r3, r6, 0;	/* Get the destination register value into r3 */
 	lhui	r3, r6, 0;	/* Get the destination register value into r3 */
 ex_lw_tail_vm:
 ex_lw_tail_vm:
@@ -996,22 +948,53 @@ ex_sw_tail_vm:
 	swi	r3, r5, 0;	/* Get the word - delay slot */
 	swi	r3, r5, 0;	/* Get the word - delay slot */
 	/* Store the word, byte-by-byte into destination address */
 	/* Store the word, byte-by-byte into destination address */
 	lbui	r3, r5, 0;
 	lbui	r3, r5, 0;
-	sbi	r3, r4, 0;
+store1:	sbi	r3, r4, 0;
 	lbui	r3, r5, 1;
 	lbui	r3, r5, 1;
-	sbi	r3, r4, 1;
+store2:	sbi	r3, r4, 1;
 	lbui	r3, r5, 2;
 	lbui	r3, r5, 2;
-	sbi	r3, r4, 2;
+store3:	sbi	r3, r4, 2;
 	lbui	r3, r5, 3;
 	lbui	r3, r5, 3;
 	brid	ret_from_exc;
 	brid	ret_from_exc;
-	sbi	r3, r4, 3;	/* Delay slot */
+store4:	sbi	r3, r4, 3;	/* Delay slot */
 ex_shw_vm:
 ex_shw_vm:
 	/* Store the lower half-word, byte-by-byte into destination address */
 	/* Store the lower half-word, byte-by-byte into destination address */
 	lbui	r3, r5, 2;
 	lbui	r3, r5, 2;
-	sbi	r3, r4, 0;
+store5:	sbi	r3, r4, 0;
 	lbui	r3, r5, 3;
 	lbui	r3, r5, 3;
 	brid	ret_from_exc;
 	brid	ret_from_exc;
-	sbi	r3, r4, 1;	/* Delay slot */
+store6:	sbi	r3, r4, 1;	/* Delay slot */
 ex_sw_end_vm:			/* Exception handling of store word, ends. */
 ex_sw_end_vm:			/* Exception handling of store word, ends. */
+
+/* We have to prevent cases that get/put_user macros get unaligned pointer
+ * to bad page area. We have to find out which origin instruction caused it
+ * and called fixup for that origin instruction not instruction in unaligned
+ * handler */
+ex_unaligned_fixup:
+	ori	r5, r7, 0 /* setup pointer to pt_regs */
+	lwi	r6, r7, PT_PC; /* faulting address is one instruction above */
+	addik	r6, r6, -4 /* for finding proper fixup */
+	swi	r6, r7, PT_PC; /* a save back it to PT_PC */
+	addik	r7, r0, SIGSEGV
+	/* call bad_page_fault for finding aligned fixup, fixup address is saved
+	 * in PT_PC which is used as return address from exception */
+	la	r15, r0, ret_from_exc-8 /* setup return address */
+	brid	bad_page_fault
+	nop
+
+/* We prevent all load/store because it could failed any attempt to access */
+.section __ex_table,"a";
+	.word	load1,ex_unaligned_fixup;
+	.word	load2,ex_unaligned_fixup;
+	.word	load3,ex_unaligned_fixup;
+	.word	load4,ex_unaligned_fixup;
+	.word	load5,ex_unaligned_fixup;
+	.word	store1,ex_unaligned_fixup;
+	.word	store2,ex_unaligned_fixup;
+	.word	store3,ex_unaligned_fixup;
+	.word	store4,ex_unaligned_fixup;
+	.word	store5,ex_unaligned_fixup;
+	.word	store6,ex_unaligned_fixup;
+.previous;
 .end _unaligned_data_exception
 .end _unaligned_data_exception
 #endif /* CONFIG_MMU */
 #endif /* CONFIG_MMU */
 
 

+ 14 - 5
arch/microblaze/kernel/module.c

@@ -57,7 +57,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
 	Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr;
 	Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr;
 	Elf32_Sym *sym;
 	Elf32_Sym *sym;
 	unsigned long int *location;
 	unsigned long int *location;
-	unsigned long int locoffs;
 	unsigned long int value;
 	unsigned long int value;
 #if __GNUC__ < 4
 #if __GNUC__ < 4
 	unsigned long int old_value;
 	unsigned long int old_value;
@@ -113,10 +112,12 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
 			break;
 			break;
 
 
 		case R_MICROBLAZE_64_PCREL:
 		case R_MICROBLAZE_64_PCREL:
-			locoffs = (location[0] & 0xFFFF) << 16 |
+#if __GNUC__ < 4
+			old_value = (location[0] & 0xFFFF) << 16 |
 				(location[1] & 0xFFFF);
 				(location[1] & 0xFFFF);
-			value -= (unsigned long int)(location) + 4 +
-				locoffs;
+			value -= old_value;
+#endif
+			value -= (unsigned long int)(location) + 4;
 			location[0] = (location[0] & 0xFFFF0000) |
 			location[0] = (location[0] & 0xFFFF0000) |
 					(value >> 16);
 					(value >> 16);
 			location[1] = (location[1] & 0xFFFF0000) |
 			location[1] = (location[1] & 0xFFFF0000) |
@@ -125,6 +126,14 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
 				value);
 				value);
 			break;
 			break;
 
 
+		case R_MICROBLAZE_32_PCREL_LO:
+			pr_debug("R_MICROBLAZE_32_PCREL_LO\n");
+			break;
+
+		case R_MICROBLAZE_64_NONE:
+			pr_debug("R_MICROBLAZE_NONE\n");
+			break;
+
 		case R_MICROBLAZE_NONE:
 		case R_MICROBLAZE_NONE:
 			pr_debug("R_MICROBLAZE_NONE\n");
 			pr_debug("R_MICROBLAZE_NONE\n");
 			break;
 			break;
@@ -133,7 +142,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
 			printk(KERN_ERR "module %s: "
 			printk(KERN_ERR "module %s: "
 				"Unknown relocation: %u\n",
 				"Unknown relocation: %u\n",
 				module->name,
 				module->name,
-				ELF32_R_TYPE(rela->r_info));
+				ELF32_R_TYPE(rela[i].r_info));
 			return -ENOEXEC;
 			return -ENOEXEC;
 		}
 		}
 	}
 	}

+ 6 - 2
arch/microblaze/kernel/setup.c

@@ -138,8 +138,12 @@ void __init machine_early_init(const char *cmdline, unsigned int ram,
 	setup_early_printk(NULL);
 	setup_early_printk(NULL);
 #endif
 #endif
 
 
-	early_printk("Ramdisk addr 0x%08x, FDT 0x%08x\n", ram, fdt);
-	printk(KERN_NOTICE "Found FDT at 0x%08x\n", fdt);
+	early_printk("Ramdisk addr 0x%08x, ", ram);
+	if (fdt)
+		early_printk("FDT at 0x%08x\n", fdt);
+	else
+		early_printk("Compiled-in FDT at 0x%08x\n",
+					(unsigned int)_fdt_start);
 
 
 #ifdef CONFIG_MTD_UCLINUX
 #ifdef CONFIG_MTD_UCLINUX
 	early_printk("Found romfs @ 0x%08x (0x%08x)\n",
 	early_printk("Found romfs @ 0x%08x (0x%08x)\n",

+ 0 - 99
arch/microblaze/kernel/sys_microblaze.c

@@ -33,105 +33,6 @@
 #include <linux/unistd.h>
 #include <linux/unistd.h>
 
 
 #include <asm/syscalls.h>
 #include <asm/syscalls.h>
-/*
- * sys_ipc() is the de-multiplexer for the SysV IPC calls..
- *
- * This is really horribly ugly. This will be remove with new toolchain.
- */
-asmlinkage long
-sys_ipc(uint call, int first, int second, int third, void *ptr, long fifth)
-{
-	int version, ret;
-
-	version = call >> 16; /* hack for backward compatibility */
-	call &= 0xffff;
-
-	ret = -EINVAL;
-	switch (call) {
-	case SEMOP:
-		ret = sys_semop(first, (struct sembuf *)ptr, second);
-		break;
-	case SEMGET:
-		ret = sys_semget(first, second, third);
-		break;
-	case SEMCTL:
-	{
-		union semun fourth;
-
-		if (!ptr)
-			break;
-		ret = (access_ok(VERIFY_READ, ptr, sizeof(long)) ? 0 : -EFAULT)
-				|| (get_user(fourth.__pad, (void **)ptr)) ;
-		if (ret)
-			break;
-		ret = sys_semctl(first, second, third, fourth);
-		break;
-	}
-	case MSGSND:
-		ret = sys_msgsnd(first, (struct msgbuf *) ptr, second, third);
-		break;
-	case MSGRCV:
-		switch (version) {
-		case 0: {
-			struct ipc_kludge tmp;
-
-			if (!ptr)
-				break;
-			ret = (access_ok(VERIFY_READ, ptr, sizeof(tmp))
-				? 0 : -EFAULT) || copy_from_user(&tmp,
-				(struct ipc_kludge *) ptr, sizeof(tmp));
-			if (ret)
-				break;
-			ret = sys_msgrcv(first, tmp.msgp, second, tmp.msgtyp,
-					third);
-			break;
-			}
-		default:
-			ret = sys_msgrcv(first, (struct msgbuf *) ptr,
-					second, fifth, third);
-			break;
-		}
-		break;
-	case MSGGET:
-		ret = sys_msgget((key_t) first, second);
-		break;
-	case MSGCTL:
-		ret = sys_msgctl(first, second, (struct msqid_ds *) ptr);
-		break;
-	case SHMAT:
-		switch (version) {
-		default: {
-			ulong raddr;
-			ret = access_ok(VERIFY_WRITE, (ulong *) third,
-					sizeof(ulong)) ? 0 : -EFAULT;
-			if (ret)
-				break;
-			ret = do_shmat(first, (char *) ptr, second, &raddr);
-			if (ret)
-				break;
-			ret = put_user(raddr, (ulong *) third);
-			break;
-			}
-		case 1:	/* iBCS2 emulator entry point */
-			if (!segment_eq(get_fs(), get_ds()))
-				break;
-			ret = do_shmat(first, (char *) ptr, second,
-					(ulong *) third);
-			break;
-		}
-		break;
-	case SHMDT:
-		ret = sys_shmdt((char *)ptr);
-		break;
-	case SHMGET:
-		ret = sys_shmget(first, second, third);
-		break;
-	case SHMCTL:
-		ret = sys_shmctl(first, second, (struct shmid_ds *) ptr);
-		break;
-	}
-	return ret;
-}
 
 
 asmlinkage long microblaze_vfork(struct pt_regs *regs)
 asmlinkage long microblaze_vfork(struct pt_regs *regs)
 {
 {

+ 1 - 1
arch/microblaze/kernel/syscall_table.S

@@ -121,7 +121,7 @@ ENTRY(sys_call_table)
 	.long sys_wait4
 	.long sys_wait4
 	.long sys_swapoff		/* 115 */
 	.long sys_swapoff		/* 115 */
 	.long sys_sysinfo
 	.long sys_sysinfo
-	.long sys_ipc
+	.long sys_ni_syscall		/* old sys_ipc */
 	.long sys_fsync
 	.long sys_fsync
 	.long sys_ni_syscall		/* sys_sigreturn_wrapper */
 	.long sys_ni_syscall		/* sys_sigreturn_wrapper */
 	.long sys_clone		/* 120 */
 	.long sys_clone		/* 120 */

+ 5 - 10
arch/microblaze/mm/fault.c

@@ -69,7 +69,7 @@ static int store_updates_sp(struct pt_regs *regs)
  * It is called from do_page_fault above and from some of the procedures
  * It is called from do_page_fault above and from some of the procedures
  * in traps.c.
  * in traps.c.
  */
  */
-static void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
+void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
 {
 {
 	const struct exception_table_entry *fixup;
 	const struct exception_table_entry *fixup;
 /* MS: no context */
 /* MS: no context */
@@ -122,15 +122,10 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
 	}
 	}
 #endif /* CONFIG_KGDB */
 #endif /* CONFIG_KGDB */
 
 
-	if (in_atomic() || mm == NULL) {
-		/* FIXME */
-		if (kernel_mode(regs)) {
-			printk(KERN_EMERG
-				"Page fault in kernel mode - Oooou!!! pid %d\n",
-				current->pid);
-			_exception(SIGSEGV, regs, code, address);
-			return;
-		}
+	if (in_atomic() || !mm) {
+		if (kernel_mode(regs))
+			goto bad_area_nosemaphore;
+
 		/* in_atomic() in user mode is really bad,
 		/* in_atomic() in user mode is really bad,
 		   as is current->mm == NULL. */
 		   as is current->mm == NULL. */
 		printk(KERN_EMERG "Page fault in user mode with "
 		printk(KERN_EMERG "Page fault in user mode with "

+ 2 - 13
arch/mips/include/asm/pgalloc.h

@@ -98,23 +98,12 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
 	__free_pages(pte, PTE_ORDER);
 	__free_pages(pte, PTE_ORDER);
 }
 }
 
 
-#define __pte_free_tlb(tlb,pte)				\
+#define __pte_free_tlb(tlb,pte,address)			\
 do {							\
 do {							\
 	pgtable_page_dtor(pte);				\
 	pgtable_page_dtor(pte);				\
 	tlb_remove_page((tlb), pte);			\
 	tlb_remove_page((tlb), pte);			\
 } while (0)
 } while (0)
 
 
-#ifdef CONFIG_32BIT
-
-/*
- * allocating and freeing a pmd is trivial: the 1-entry pmd is
- * inside the pgd, so has no extra memory associated with it.
- */
-#define pmd_free(mm, x)			do { } while (0)
-#define __pmd_free_tlb(tlb, x)		do { } while (0)
-
-#endif
-
 #ifdef CONFIG_64BIT
 #ifdef CONFIG_64BIT
 
 
 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
@@ -132,7 +121,7 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
 	free_pages((unsigned long)pmd, PMD_ORDER);
 	free_pages((unsigned long)pmd, PMD_ORDER);
 }
 }
 
 
-#define __pmd_free_tlb(tlb, x)	pmd_free((tlb)->mm, x)
+#define __pmd_free_tlb(tlb, x, addr)	pmd_free((tlb)->mm, x)
 
 
 #endif
 #endif
 
 

+ 1 - 1
arch/mn10300/include/asm/pgalloc.h

@@ -51,6 +51,6 @@ static inline void pte_free(struct mm_struct *mm, struct page *pte)
 }
 }
 
 
 
 
-#define __pte_free_tlb(tlb, pte) tlb_remove_page((tlb), (pte))
+#define __pte_free_tlb(tlb, pte, addr) tlb_remove_page((tlb), (pte))
 
 
 #endif /* _ASM_PGALLOC_H */
 #endif /* _ASM_PGALLOC_H */

+ 2 - 2
arch/parisc/include/asm/tlb.h

@@ -21,7 +21,7 @@ do {	if (!(tlb)->fullmm)	\
 
 
 #include <asm-generic/tlb.h>
 #include <asm-generic/tlb.h>
 
 
-#define __pmd_free_tlb(tlb, pmd)	pmd_free((tlb)->mm, pmd)
-#define __pte_free_tlb(tlb, pte)	pte_free((tlb)->mm, pte)
+#define __pmd_free_tlb(tlb, pmd, addr)	pmd_free((tlb)->mm, pmd)
+#define __pte_free_tlb(tlb, pte, addr)	pte_free((tlb)->mm, pte)
 
 
 #endif
 #endif

+ 1 - 1
arch/powerpc/include/asm/pgalloc-32.h

@@ -16,7 +16,7 @@ extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
  */
  */
 /* #define pmd_alloc_one(mm,address)       ({ BUG(); ((pmd_t *)2); }) */
 /* #define pmd_alloc_one(mm,address)       ({ BUG(); ((pmd_t *)2); }) */
 #define pmd_free(mm, x) 		do { } while (0)
 #define pmd_free(mm, x) 		do { } while (0)
-#define __pmd_free_tlb(tlb,x)		do { } while (0)
+#define __pmd_free_tlb(tlb,x,a)		do { } while (0)
 /* #define pgd_populate(mm, pmd, pte)      BUG() */
 /* #define pgd_populate(mm, pmd, pte)      BUG() */
 
 
 #ifndef CONFIG_BOOKE
 #ifndef CONFIG_BOOKE

+ 2 - 2
arch/powerpc/include/asm/pgalloc-64.h

@@ -118,11 +118,11 @@ static inline void pgtable_free(pgtable_free_t pgf)
 		kmem_cache_free(pgtable_cache[cachenum], p);
 		kmem_cache_free(pgtable_cache[cachenum], p);
 }
 }
 
 
-#define __pmd_free_tlb(tlb, pmd) 	\
+#define __pmd_free_tlb(tlb, pmd,addr)		      \
 	pgtable_free_tlb(tlb, pgtable_free_cache(pmd, \
 	pgtable_free_tlb(tlb, pgtable_free_cache(pmd, \
 		PMD_CACHE_NUM, PMD_TABLE_SIZE-1))
 		PMD_CACHE_NUM, PMD_TABLE_SIZE-1))
 #ifndef CONFIG_PPC_64K_PAGES
 #ifndef CONFIG_PPC_64K_PAGES
-#define __pud_free_tlb(tlb, pud)	\
+#define __pud_free_tlb(tlb, pud, addr)		      \
 	pgtable_free_tlb(tlb, pgtable_free_cache(pud, \
 	pgtable_free_tlb(tlb, pgtable_free_cache(pud, \
 		PUD_CACHE_NUM, PUD_TABLE_SIZE-1))
 		PUD_CACHE_NUM, PUD_TABLE_SIZE-1))
 #endif /* CONFIG_PPC_64K_PAGES */
 #endif /* CONFIG_PPC_64K_PAGES */

+ 3 - 3
arch/powerpc/include/asm/pgalloc.h

@@ -38,14 +38,14 @@ static inline pgtable_free_t pgtable_free_cache(void *p, int cachenum,
 extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf);
 extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf);
 
 
 #ifdef CONFIG_SMP
 #ifdef CONFIG_SMP
-#define __pte_free_tlb(tlb,ptepage)	\
+#define __pte_free_tlb(tlb,ptepage,address)		\
 do { \
 do { \
 	pgtable_page_dtor(ptepage); \
 	pgtable_page_dtor(ptepage); \
 	pgtable_free_tlb(tlb, pgtable_free_cache(page_address(ptepage), \
 	pgtable_free_tlb(tlb, pgtable_free_cache(page_address(ptepage), \
-		PTE_NONCACHE_NUM, PTE_TABLE_SIZE-1)); \
+					PTE_NONCACHE_NUM, PTE_TABLE_SIZE-1)); \
 } while (0)
 } while (0)
 #else
 #else
-#define __pte_free_tlb(tlb, pte)	pte_free((tlb)->mm, (pte))
+#define __pte_free_tlb(tlb, pte, address)	pte_free((tlb)->mm, (pte))
 #endif
 #endif
 
 
 
 

+ 2 - 2
arch/powerpc/mm/hugetlbpage.c

@@ -305,7 +305,7 @@ static void hugetlb_free_pmd_range(struct mmu_gather *tlb, pud_t *pud,
 
 
 	pmd = pmd_offset(pud, start);
 	pmd = pmd_offset(pud, start);
 	pud_clear(pud);
 	pud_clear(pud);
-	pmd_free_tlb(tlb, pmd);
+	pmd_free_tlb(tlb, pmd, start);
 }
 }
 
 
 static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
 static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
@@ -348,7 +348,7 @@ static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
 
 
 	pud = pud_offset(pgd, start);
 	pud = pud_offset(pgd, start);
 	pgd_clear(pgd);
 	pgd_clear(pgd);
-	pud_free_tlb(tlb, pud);
+	pud_free_tlb(tlb, pud, start);
 }
 }
 
 
 /*
 /*

+ 6 - 3
arch/s390/include/asm/tlb.h

@@ -96,7 +96,8 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
  * pte_free_tlb frees a pte table and clears the CRSTE for the
  * pte_free_tlb frees a pte table and clears the CRSTE for the
  * page table from the tlb.
  * page table from the tlb.
  */
  */
-static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte)
+static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
+				unsigned long address)
 {
 {
 	if (!tlb->fullmm) {
 	if (!tlb->fullmm) {
 		tlb->array[tlb->nr_ptes++] = pte;
 		tlb->array[tlb->nr_ptes++] = pte;
@@ -113,7 +114,8 @@ static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte)
  * as the pgd. pmd_free_tlb checks the asce_limit against 2GB
  * as the pgd. pmd_free_tlb checks the asce_limit against 2GB
  * to avoid the double free of the pmd in this case.
  * to avoid the double free of the pmd in this case.
  */
  */
-static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
+static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
+				unsigned long address)
 {
 {
 #ifdef __s390x__
 #ifdef __s390x__
 	if (tlb->mm->context.asce_limit <= (1UL << 31))
 	if (tlb->mm->context.asce_limit <= (1UL << 31))
@@ -134,7 +136,8 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
  * as the pgd. pud_free_tlb checks the asce_limit against 4TB
  * as the pgd. pud_free_tlb checks the asce_limit against 4TB
  * to avoid the double free of the pud in this case.
  * to avoid the double free of the pud in this case.
  */
  */
-static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud)
+static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
+				unsigned long address)
 {
 {
 #ifdef __s390x__
 #ifdef __s390x__
 	if (tlb->mm->context.asce_limit <= (1UL << 42))
 	if (tlb->mm->context.asce_limit <= (1UL << 42))

+ 2 - 2
arch/s390/kernel/early.c

@@ -210,7 +210,7 @@ static noinline __init void detect_machine_type(void)
 		machine_flags |= MACHINE_FLAG_VM;
 		machine_flags |= MACHINE_FLAG_VM;
 }
 }
 
 
-static void early_pgm_check_handler(void)
+static __init void early_pgm_check_handler(void)
 {
 {
 	unsigned long addr;
 	unsigned long addr;
 	const struct exception_table_entry *fixup;
 	const struct exception_table_entry *fixup;
@@ -222,7 +222,7 @@ static void early_pgm_check_handler(void)
 	S390_lowcore.program_old_psw.addr = fixup->fixup | PSW_ADDR_AMODE;
 	S390_lowcore.program_old_psw.addr = fixup->fixup | PSW_ADDR_AMODE;
 }
 }
 
 
-void setup_lowcore_early(void)
+static noinline __init void setup_lowcore_early(void)
 {
 {
 	psw_t psw;
 	psw_t psw;
 
 

+ 4 - 3
arch/s390/kernel/smp.c

@@ -687,13 +687,14 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
 #ifndef CONFIG_64BIT
 #ifndef CONFIG_64BIT
 	if (MACHINE_HAS_IEEE)
 	if (MACHINE_HAS_IEEE)
 		lowcore->extended_save_area_addr = (u32) save_area;
 		lowcore->extended_save_area_addr = (u32) save_area;
-#else
-	if (vdso_alloc_per_cpu(smp_processor_id(), lowcore))
-		BUG();
 #endif
 #endif
 	set_prefix((u32)(unsigned long) lowcore);
 	set_prefix((u32)(unsigned long) lowcore);
 	local_mcck_enable();
 	local_mcck_enable();
 	local_irq_enable();
 	local_irq_enable();
+#ifdef CONFIG_64BIT
+	if (vdso_alloc_per_cpu(smp_processor_id(), &S390_lowcore))
+		BUG();
+#endif
 	for_each_possible_cpu(cpu)
 	for_each_possible_cpu(cpu)
 		if (cpu != smp_processor_id())
 		if (cpu != smp_processor_id())
 			smp_create_idle(cpu);
 			smp_create_idle(cpu);

+ 9 - 2
arch/s390/kernel/vdso64/clock_gettime.S

@@ -88,10 +88,17 @@ __kernel_clock_gettime:
 	llilh	%r4,0x0100
 	llilh	%r4,0x0100
 	sar	%a4,%r4
 	sar	%a4,%r4
 	lghi	%r4,0
 	lghi	%r4,0
+	epsw	%r5,0
 	sacf	512				/* Magic ectg instruction */
 	sacf	512				/* Magic ectg instruction */
 	.insn	ssf,0xc80100000000,__VDSO_ECTG_BASE(4),__VDSO_ECTG_USER(4),4
 	.insn	ssf,0xc80100000000,__VDSO_ECTG_BASE(4),__VDSO_ECTG_USER(4),4
-	sacf	0
-	sar	%a4,%r2
+	tml	%r5,0x4000
+	jo	11f
+	tml	%r5,0x8000
+	jno	10f
+	sacf	256
+	j	11f
+10:	sacf	0
+11:	sar	%a4,%r2
 	algr	%r1,%r0				/* r1 = cputime as TOD value */
 	algr	%r1,%r0				/* r1 = cputime as TOD value */
 	mghi	%r1,1000			/* convert to nanoseconds */
 	mghi	%r1,1000			/* convert to nanoseconds */
 	srlg	%r1,%r1,12			/* r1 = cputime in nanosec */
 	srlg	%r1,%r1,12			/* r1 = cputime in nanosec */

+ 24 - 12
arch/s390/power/swsusp.c

@@ -7,24 +7,36 @@
  *
  *
  */
  */
 
 
+#include <asm/system.h>
 
 
-/*
- * save CPU registers before creating a hibernation image and before
- * restoring the memory state from it
- */
 void save_processor_state(void)
 void save_processor_state(void)
 {
 {
-	/* implentation contained in the
-	 * swsusp_arch_suspend function
+	/* swsusp_arch_suspend() actually saves all cpu register contents.
+	 * Machine checks must be disabled since swsusp_arch_suspend() stores
+	 * register contents to their lowcore save areas. That's the same
+	 * place where register contents on machine checks would be saved.
+	 * To avoid register corruption disable machine checks.
+	 * We must also disable machine checks in the new psw mask for
+	 * program checks, since swsusp_arch_suspend() may generate program
+	 * checks. Disabling machine checks for all other new psw masks is
+	 * just paranoia.
 	 */
 	 */
+	local_mcck_disable();
+	/* Disable lowcore protection */
+	__ctl_clear_bit(0,28);
+	S390_lowcore.external_new_psw.mask &= ~PSW_MASK_MCHECK;
+	S390_lowcore.svc_new_psw.mask &= ~PSW_MASK_MCHECK;
+	S390_lowcore.io_new_psw.mask &= ~PSW_MASK_MCHECK;
+	S390_lowcore.program_new_psw.mask &= ~PSW_MASK_MCHECK;
 }
 }
 
 
-/*
- * restore the contents of CPU registers
- */
 void restore_processor_state(void)
 void restore_processor_state(void)
 {
 {
-	/* implentation contained in the
-	 * swsusp_arch_resume function
-	 */
+	S390_lowcore.external_new_psw.mask |= PSW_MASK_MCHECK;
+	S390_lowcore.svc_new_psw.mask |= PSW_MASK_MCHECK;
+	S390_lowcore.io_new_psw.mask |= PSW_MASK_MCHECK;
+	S390_lowcore.program_new_psw.mask |= PSW_MASK_MCHECK;
+	/* Enable lowcore protection */
+	__ctl_set_bit(0,28);
+	local_mcck_enable();
 }
 }

+ 9 - 26
arch/s390/power/swsusp_asm64.S

@@ -32,19 +32,14 @@ swsusp_arch_suspend:
 	/* Deactivate DAT */
 	/* Deactivate DAT */
 	stnsm	__SF_EMPTY(%r15),0xfb
 	stnsm	__SF_EMPTY(%r15),0xfb
 
 
-	/* Switch off lowcore protection */
-	stctg	%c0,%c0,__SF_EMPTY(%r15)
-	ni	__SF_EMPTY+4(%r15),0xef
-	lctlg	%c0,%c0,__SF_EMPTY(%r15)
-
 	/* Store prefix register on stack */
 	/* Store prefix register on stack */
 	stpx	__SF_EMPTY(%r15)
 	stpx	__SF_EMPTY(%r15)
 
 
-	/* Setup base register for lowcore (absolute 0) */
-	llgf	%r1,__SF_EMPTY(%r15)
+	/* Save prefix register contents for lowcore */
+	llgf	%r4,__SF_EMPTY(%r15)
 
 
 	/* Get pointer to save area */
 	/* Get pointer to save area */
-	aghi	%r1,0x1000
+	lghi	%r1,0x1000
 
 
 	/* Store registers */
 	/* Store registers */
 	mvc	0x318(4,%r1),__SF_EMPTY(%r15)	/* move prefix to lowcore */
 	mvc	0x318(4,%r1),__SF_EMPTY(%r15)	/* move prefix to lowcore */
@@ -79,17 +74,15 @@ swsusp_arch_suspend:
 	xc	__SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
 	xc	__SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
 	spx	__SF_EMPTY(%r15)
 	spx	__SF_EMPTY(%r15)
 
 
-	/* Setup lowcore */
-	brasl	%r14,setup_lowcore_early
+	lghi	%r2,0
+	lghi	%r3,2*PAGE_SIZE
+	lghi	%r5,2*PAGE_SIZE
+1:	mvcle	%r2,%r4,0
+	jo	1b
 
 
 	/* Save image */
 	/* Save image */
 	brasl	%r14,swsusp_save
 	brasl	%r14,swsusp_save
 
 
-	/* Switch on lowcore protection */
-	stctg	%c0,%c0,__SF_EMPTY(%r15)
-	oi	__SF_EMPTY+4(%r15),0x10
-	lctlg	%c0,%c0,__SF_EMPTY(%r15)
-
 	/* Restore prefix register and return */
 	/* Restore prefix register and return */
 	lghi	%r1,0x1000
 	lghi	%r1,0x1000
 	spx	0x318(%r1)
 	spx	0x318(%r1)
@@ -117,11 +110,6 @@ swsusp_arch_resume:
 	/* Deactivate DAT */
 	/* Deactivate DAT */
 	stnsm	__SF_EMPTY(%r15),0xfb
 	stnsm	__SF_EMPTY(%r15),0xfb
 
 
-	/* Switch off lowcore protection */
-	stctg	%c0,%c0,__SF_EMPTY(%r15)
-	ni	__SF_EMPTY+4(%r15),0xef
-	lctlg	%c0,%c0,__SF_EMPTY(%r15)
-
 	/* Set prefix page to zero */
 	/* Set prefix page to zero */
 	xc	__SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
 	xc	__SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
 	spx	__SF_EMPTY(%r15)
 	spx	__SF_EMPTY(%r15)
@@ -175,7 +163,7 @@ swsusp_arch_resume:
 	/* Load old stack */
 	/* Load old stack */
 	lg	%r15,0x2f8(%r13)
 	lg	%r15,0x2f8(%r13)
 
 
-	/* Pointer to save arae */
+	/* Pointer to save area */
 	lghi	%r13,0x1000
 	lghi	%r13,0x1000
 
 
 #ifdef CONFIG_SMP
 #ifdef CONFIG_SMP
@@ -187,11 +175,6 @@ swsusp_arch_resume:
 	/* Restore prefix register */
 	/* Restore prefix register */
 	spx	0x318(%r13)
 	spx	0x318(%r13)
 
 
-	/* Switch on lowcore protection */
-	stctg	%c0,%c0,__SF_EMPTY(%r15)
-	oi	__SF_EMPTY+4(%r15),0x10
-	lctlg	%c0,%c0,__SF_EMPTY(%r15)
-
 	/* Activate DAT */
 	/* Activate DAT */
 	stosm	__SF_EMPTY(%r15),0x04
 	stosm	__SF_EMPTY(%r15),0x04
 
 

+ 1 - 9
arch/sh/include/asm/pgalloc.h

@@ -73,20 +73,12 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
 	quicklist_free_page(QUICK_PT, NULL, pte);
 	quicklist_free_page(QUICK_PT, NULL, pte);
 }
 }
 
 
-#define __pte_free_tlb(tlb,pte)				\
+#define __pte_free_tlb(tlb,pte,addr)			\
 do {							\
 do {							\
 	pgtable_page_dtor(pte);				\
 	pgtable_page_dtor(pte);				\
 	tlb_remove_page((tlb), (pte));			\
 	tlb_remove_page((tlb), (pte));			\
 } while (0)
 } while (0)
 
 
-/*
- * allocating and freeing a pmd is trivial: the 1-entry pmd is
- * inside the pgd, so has no extra memory associated with it.
- */
-
-#define pmd_free(mm, x)			do { } while (0)
-#define __pmd_free_tlb(tlb,x)		do { } while (0)
-
 static inline void check_pgt_cache(void)
 static inline void check_pgt_cache(void)
 {
 {
 	quicklist_trim(QUICK_PGD, NULL, 25, 16);
 	quicklist_trim(QUICK_PGD, NULL, 25, 16);

+ 3 - 3
arch/sh/include/asm/tlb.h

@@ -91,9 +91,9 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
 }
 }
 
 
 #define tlb_remove_page(tlb,page)	free_page_and_swap_cache(page)
 #define tlb_remove_page(tlb,page)	free_page_and_swap_cache(page)
-#define pte_free_tlb(tlb, ptep)		pte_free((tlb)->mm, ptep)
-#define pmd_free_tlb(tlb, pmdp)		pmd_free((tlb)->mm, pmdp)
-#define pud_free_tlb(tlb, pudp)		pud_free((tlb)->mm, pudp)
+#define pte_free_tlb(tlb, ptep, addr)	pte_free((tlb)->mm, ptep)
+#define pmd_free_tlb(tlb, pmdp, addr)	pmd_free((tlb)->mm, pmdp)
+#define pud_free_tlb(tlb, pudp, addr)	pud_free((tlb)->mm, pudp)
 
 
 #define tlb_migrate_finish(mm)		do { } while (0)
 #define tlb_migrate_finish(mm)		do { } while (0)
 
 

+ 4 - 4
arch/sparc/include/asm/pgalloc_32.h

@@ -44,8 +44,8 @@ BTFIXUPDEF_CALL(pmd_t *, pmd_alloc_one, struct mm_struct *, unsigned long)
 BTFIXUPDEF_CALL(void, free_pmd_fast, pmd_t *)
 BTFIXUPDEF_CALL(void, free_pmd_fast, pmd_t *)
 #define free_pmd_fast(pmd)	BTFIXUP_CALL(free_pmd_fast)(pmd)
 #define free_pmd_fast(pmd)	BTFIXUP_CALL(free_pmd_fast)(pmd)
 
 
-#define pmd_free(mm, pmd)	free_pmd_fast(pmd)
-#define __pmd_free_tlb(tlb, pmd) pmd_free((tlb)->mm, pmd)
+#define pmd_free(mm, pmd)		free_pmd_fast(pmd)
+#define __pmd_free_tlb(tlb, pmd, addr)	pmd_free((tlb)->mm, pmd)
 
 
 BTFIXUPDEF_CALL(void, pmd_populate, pmd_t *, struct page *)
 BTFIXUPDEF_CALL(void, pmd_populate, pmd_t *, struct page *)
 #define pmd_populate(MM, PMD, PTE)        BTFIXUP_CALL(pmd_populate)(PMD, PTE)
 #define pmd_populate(MM, PMD, PTE)        BTFIXUP_CALL(pmd_populate)(PMD, PTE)
@@ -62,7 +62,7 @@ BTFIXUPDEF_CALL(void, free_pte_fast, pte_t *)
 #define pte_free_kernel(mm, pte)	BTFIXUP_CALL(free_pte_fast)(pte)
 #define pte_free_kernel(mm, pte)	BTFIXUP_CALL(free_pte_fast)(pte)
 
 
 BTFIXUPDEF_CALL(void, pte_free, pgtable_t )
 BTFIXUPDEF_CALL(void, pte_free, pgtable_t )
-#define pte_free(mm, pte)	BTFIXUP_CALL(pte_free)(pte)
-#define __pte_free_tlb(tlb, pte)	pte_free((tlb)->mm, pte)
+#define pte_free(mm, pte)		BTFIXUP_CALL(pte_free)(pte)
+#define __pte_free_tlb(tlb, pte, addr)	pte_free((tlb)->mm, pte)
 
 
 #endif /* _SPARC_PGALLOC_H */
 #endif /* _SPARC_PGALLOC_H */

+ 3 - 3
arch/sparc/include/asm/tlb_64.h

@@ -100,9 +100,9 @@ static inline void tlb_remove_page(struct mmu_gather *mp, struct page *page)
 }
 }
 
 
 #define tlb_remove_tlb_entry(mp,ptep,addr) do { } while (0)
 #define tlb_remove_tlb_entry(mp,ptep,addr) do { } while (0)
-#define pte_free_tlb(mp, ptepage) pte_free((mp)->mm, ptepage)
-#define pmd_free_tlb(mp, pmdp) pmd_free((mp)->mm, pmdp)
-#define pud_free_tlb(tlb,pudp) __pud_free_tlb(tlb,pudp)
+#define pte_free_tlb(mp, ptepage, addr) pte_free((mp)->mm, ptepage)
+#define pmd_free_tlb(mp, pmdp, addr) pmd_free((mp)->mm, pmdp)
+#define pud_free_tlb(tlb,pudp, addr) __pud_free_tlb(tlb,pudp,addr)
 
 
 #define tlb_migrate_finish(mm)	do { } while (0)
 #define tlb_migrate_finish(mm)	do { } while (0)
 #define tlb_start_vma(tlb, vma) do { } while (0)
 #define tlb_start_vma(tlb, vma) do { } while (0)

+ 2 - 2
arch/um/include/asm/pgalloc.h

@@ -40,7 +40,7 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
 	__free_page(pte);
 	__free_page(pte);
 }
 }
 
 
-#define __pte_free_tlb(tlb,pte)				\
+#define __pte_free_tlb(tlb,pte, address)		\
 do {							\
 do {							\
 	pgtable_page_dtor(pte);				\
 	pgtable_page_dtor(pte);				\
 	tlb_remove_page((tlb),(pte));			\
 	tlb_remove_page((tlb),(pte));			\
@@ -53,7 +53,7 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
 	free_page((unsigned long)pmd);
 	free_page((unsigned long)pmd);
 }
 }
 
 
-#define __pmd_free_tlb(tlb,x)   tlb_remove_page((tlb),virt_to_page(x))
+#define __pmd_free_tlb(tlb,x, address)   tlb_remove_page((tlb),virt_to_page(x))
 #endif
 #endif
 
 
 #define check_pgt_cache()	do { } while (0)
 #define check_pgt_cache()	do { } while (0)

+ 3 - 3
arch/um/include/asm/tlb.h

@@ -116,11 +116,11 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
 		__tlb_remove_tlb_entry(tlb, ptep, address);	\
 		__tlb_remove_tlb_entry(tlb, ptep, address);	\
 	} while (0)
 	} while (0)
 
 
-#define pte_free_tlb(tlb, ptep) __pte_free_tlb(tlb, ptep)
+#define pte_free_tlb(tlb, ptep, addr) __pte_free_tlb(tlb, ptep, addr)
 
 
-#define pud_free_tlb(tlb, pudp) __pud_free_tlb(tlb, pudp)
+#define pud_free_tlb(tlb, pudp, addr) __pud_free_tlb(tlb, pudp, addr)
 
 
-#define pmd_free_tlb(tlb, pmdp) __pmd_free_tlb(tlb, pmdp)
+#define pmd_free_tlb(tlb, pmdp, addr) __pmd_free_tlb(tlb, pmdp, addr)
 
 
 #define tlb_migrate_finish(mm) do {} while (0)
 #define tlb_migrate_finish(mm) do {} while (0)
 
 

+ 22 - 3
arch/x86/include/asm/pgalloc.h

@@ -46,7 +46,13 @@ static inline void pte_free(struct mm_struct *mm, struct page *pte)
 	__free_page(pte);
 	__free_page(pte);
 }
 }
 
 
-extern void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte);
+extern void ___pte_free_tlb(struct mmu_gather *tlb, struct page *pte);
+
+static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte,
+				  unsigned long address)
+{
+	___pte_free_tlb(tlb, pte);
+}
 
 
 static inline void pmd_populate_kernel(struct mm_struct *mm,
 static inline void pmd_populate_kernel(struct mm_struct *mm,
 				       pmd_t *pmd, pte_t *pte)
 				       pmd_t *pmd, pte_t *pte)
@@ -78,7 +84,13 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
 	free_page((unsigned long)pmd);
 	free_page((unsigned long)pmd);
 }
 }
 
 
-extern void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd);
+extern void ___pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd);
+
+static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
+				  unsigned long adddress)
+{
+	___pmd_free_tlb(tlb, pmd);
+}
 
 
 #ifdef CONFIG_X86_PAE
 #ifdef CONFIG_X86_PAE
 extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
 extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd);
@@ -108,7 +120,14 @@ static inline void pud_free(struct mm_struct *mm, pud_t *pud)
 	free_page((unsigned long)pud);
 	free_page((unsigned long)pud);
 }
 }
 
 
-extern void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud);
+extern void ___pud_free_tlb(struct mmu_gather *tlb, pud_t *pud);
+
+static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
+				  unsigned long address)
+{
+	___pud_free_tlb(tlb, pud);
+}
+
 #endif	/* PAGETABLE_LEVELS > 3 */
 #endif	/* PAGETABLE_LEVELS > 3 */
 #endif	/* PAGETABLE_LEVELS > 2 */
 #endif	/* PAGETABLE_LEVELS > 2 */
 
 

+ 2 - 2
arch/x86/include/asm/uaccess.h

@@ -212,9 +212,9 @@ extern int __get_user_bad(void);
 		     : "A" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx")
 		     : "A" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx")
 #else
 #else
 #define __put_user_asm_u64(x, ptr, retval, errret) \
 #define __put_user_asm_u64(x, ptr, retval, errret) \
-	__put_user_asm(x, ptr, retval, "q", "", "Zr", errret)
+	__put_user_asm(x, ptr, retval, "q", "", "er", errret)
 #define __put_user_asm_ex_u64(x, addr)	\
 #define __put_user_asm_ex_u64(x, addr)	\
-	__put_user_asm_ex(x, addr, "q", "", "Zr")
+	__put_user_asm_ex(x, addr, "q", "", "er")
 #define __put_user_x8(x, ptr, __ret_pu) __put_user_x(8, x, ptr, __ret_pu)
 #define __put_user_x8(x, ptr, __ret_pu) __put_user_x(8, x, ptr, __ret_pu)
 #endif
 #endif
 
 

+ 5 - 5
arch/x86/include/asm/uaccess_64.h

@@ -88,11 +88,11 @@ int __copy_to_user(void __user *dst, const void *src, unsigned size)
 			      ret, "l", "k", "ir", 4);
 			      ret, "l", "k", "ir", 4);
 		return ret;
 		return ret;
 	case 8:__put_user_asm(*(u64 *)src, (u64 __user *)dst,
 	case 8:__put_user_asm(*(u64 *)src, (u64 __user *)dst,
-			      ret, "q", "", "ir", 8);
+			      ret, "q", "", "er", 8);
 		return ret;
 		return ret;
 	case 10:
 	case 10:
 		__put_user_asm(*(u64 *)src, (u64 __user *)dst,
 		__put_user_asm(*(u64 *)src, (u64 __user *)dst,
-			       ret, "q", "", "ir", 10);
+			       ret, "q", "", "er", 10);
 		if (unlikely(ret))
 		if (unlikely(ret))
 			return ret;
 			return ret;
 		asm("":::"memory");
 		asm("":::"memory");
@@ -101,12 +101,12 @@ int __copy_to_user(void __user *dst, const void *src, unsigned size)
 		return ret;
 		return ret;
 	case 16:
 	case 16:
 		__put_user_asm(*(u64 *)src, (u64 __user *)dst,
 		__put_user_asm(*(u64 *)src, (u64 __user *)dst,
-			       ret, "q", "", "ir", 16);
+			       ret, "q", "", "er", 16);
 		if (unlikely(ret))
 		if (unlikely(ret))
 			return ret;
 			return ret;
 		asm("":::"memory");
 		asm("":::"memory");
 		__put_user_asm(1[(u64 *)src], 1 + (u64 __user *)dst,
 		__put_user_asm(1[(u64 *)src], 1 + (u64 __user *)dst,
-			       ret, "q", "", "ir", 8);
+			       ret, "q", "", "er", 8);
 		return ret;
 		return ret;
 	default:
 	default:
 		return copy_user_generic((__force void *)dst, src, size);
 		return copy_user_generic((__force void *)dst, src, size);
@@ -157,7 +157,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
 			       ret, "q", "", "=r", 8);
 			       ret, "q", "", "=r", 8);
 		if (likely(!ret))
 		if (likely(!ret))
 			__put_user_asm(tmp, (u64 __user *)dst,
 			__put_user_asm(tmp, (u64 __user *)dst,
-				       ret, "q", "", "ir", 8);
+				       ret, "q", "", "er", 8);
 		return ret;
 		return ret;
 	}
 	}
 	default:
 	default:

+ 1 - 1
arch/x86/kernel/cpu/amd.c

@@ -356,7 +356,7 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)
 #endif
 #endif
 #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_PCI)
 #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_PCI)
 	/* check CPU config space for extended APIC ID */
 	/* check CPU config space for extended APIC ID */
-	if (c->x86 >= 0xf) {
+	if (cpu_has_apic && c->x86 >= 0xf) {
 		unsigned int val;
 		unsigned int val;
 		val = read_pci_config(0, 24, 0, 0x68);
 		val = read_pci_config(0, 24, 0, 0x68);
 		if ((val & ((1 << 17) | (1 << 18))) == ((1 << 17) | (1 << 18)))
 		if ((val & ((1 << 17) | (1 << 18))) == ((1 << 17) | (1 << 18)))

+ 2 - 4
arch/x86/kernel/cpu/mcheck/mce.c

@@ -1692,17 +1692,15 @@ static ssize_t set_trigger(struct sys_device *s, struct sysdev_attribute *attr,
 				const char *buf, size_t siz)
 				const char *buf, size_t siz)
 {
 {
 	char *p;
 	char *p;
-	int len;
 
 
 	strncpy(mce_helper, buf, sizeof(mce_helper));
 	strncpy(mce_helper, buf, sizeof(mce_helper));
 	mce_helper[sizeof(mce_helper)-1] = 0;
 	mce_helper[sizeof(mce_helper)-1] = 0;
-	len = strlen(mce_helper);
 	p = strchr(mce_helper, '\n');
 	p = strchr(mce_helper, '\n');
 
 
-	if (*p)
+	if (p)
 		*p = 0;
 		*p = 0;
 
 
-	return len;
+	return strlen(mce_helper) + !!p;
 }
 }
 
 
 static ssize_t set_ignore_ce(struct sys_device *s,
 static ssize_t set_ignore_ce(struct sys_device *s,

+ 233 - 20
arch/x86/kernel/cpu/perf_counter.c

@@ -65,6 +65,52 @@ static DEFINE_PER_CPU(struct cpu_hw_counters, cpu_hw_counters) = {
 	.enabled = 1,
 	.enabled = 1,
 };
 };
 
 
+/*
+ * Not sure about some of these
+ */
+static const u64 p6_perfmon_event_map[] =
+{
+  [PERF_COUNT_HW_CPU_CYCLES]		= 0x0079,
+  [PERF_COUNT_HW_INSTRUCTIONS]		= 0x00c0,
+  [PERF_COUNT_HW_CACHE_REFERENCES]	= 0x0000,
+  [PERF_COUNT_HW_CACHE_MISSES]		= 0x0000,
+  [PERF_COUNT_HW_BRANCH_INSTRUCTIONS]	= 0x00c4,
+  [PERF_COUNT_HW_BRANCH_MISSES]		= 0x00c5,
+  [PERF_COUNT_HW_BUS_CYCLES]		= 0x0062,
+};
+
+static u64 p6_pmu_event_map(int event)
+{
+	return p6_perfmon_event_map[event];
+}
+
+/*
+ * Counter setting that is specified not to count anything.
+ * We use this to effectively disable a counter.
+ *
+ * L2_RQSTS with 0 MESI unit mask.
+ */
+#define P6_NOP_COUNTER			0x0000002EULL
+
+static u64 p6_pmu_raw_event(u64 event)
+{
+#define P6_EVNTSEL_EVENT_MASK		0x000000FFULL
+#define P6_EVNTSEL_UNIT_MASK		0x0000FF00ULL
+#define P6_EVNTSEL_EDGE_MASK		0x00040000ULL
+#define P6_EVNTSEL_INV_MASK		0x00800000ULL
+#define P6_EVNTSEL_COUNTER_MASK		0xFF000000ULL
+
+#define P6_EVNTSEL_MASK			\
+	(P6_EVNTSEL_EVENT_MASK |	\
+	 P6_EVNTSEL_UNIT_MASK  |	\
+	 P6_EVNTSEL_EDGE_MASK  |	\
+	 P6_EVNTSEL_INV_MASK   |	\
+	 P6_EVNTSEL_COUNTER_MASK)
+
+	return event & P6_EVNTSEL_MASK;
+}
+
+
 /*
 /*
  * Intel PerfMon v3. Used on Core2 and later.
  * Intel PerfMon v3. Used on Core2 and later.
  */
  */
@@ -666,6 +712,7 @@ static int __hw_perf_counter_init(struct perf_counter *counter)
 {
 {
 	struct perf_counter_attr *attr = &counter->attr;
 	struct perf_counter_attr *attr = &counter->attr;
 	struct hw_perf_counter *hwc = &counter->hw;
 	struct hw_perf_counter *hwc = &counter->hw;
+	u64 config;
 	int err;
 	int err;
 
 
 	if (!x86_pmu_initialized())
 	if (!x86_pmu_initialized())
@@ -718,14 +765,40 @@ static int __hw_perf_counter_init(struct perf_counter *counter)
 
 
 	if (attr->config >= x86_pmu.max_events)
 	if (attr->config >= x86_pmu.max_events)
 		return -EINVAL;
 		return -EINVAL;
+
 	/*
 	/*
 	 * The generic map:
 	 * The generic map:
 	 */
 	 */
-	hwc->config |= x86_pmu.event_map(attr->config);
+	config = x86_pmu.event_map(attr->config);
+
+	if (config == 0)
+		return -ENOENT;
+
+	if (config == -1LL)
+		return -EINVAL;
+
+	hwc->config |= config;
 
 
 	return 0;
 	return 0;
 }
 }
 
 
+static void p6_pmu_disable_all(void)
+{
+	struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters);
+	u64 val;
+
+	if (!cpuc->enabled)
+		return;
+
+	cpuc->enabled = 0;
+	barrier();
+
+	/* p6 only has one enable register */
+	rdmsrl(MSR_P6_EVNTSEL0, val);
+	val &= ~ARCH_PERFMON_EVENTSEL0_ENABLE;
+	wrmsrl(MSR_P6_EVNTSEL0, val);
+}
+
 static void intel_pmu_disable_all(void)
 static void intel_pmu_disable_all(void)
 {
 {
 	wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0);
 	wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0);
@@ -767,6 +840,23 @@ void hw_perf_disable(void)
 	return x86_pmu.disable_all();
 	return x86_pmu.disable_all();
 }
 }
 
 
+static void p6_pmu_enable_all(void)
+{
+	struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters);
+	unsigned long val;
+
+	if (cpuc->enabled)
+		return;
+
+	cpuc->enabled = 1;
+	barrier();
+
+	/* p6 only has one enable register */
+	rdmsrl(MSR_P6_EVNTSEL0, val);
+	val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
+	wrmsrl(MSR_P6_EVNTSEL0, val);
+}
+
 static void intel_pmu_enable_all(void)
 static void intel_pmu_enable_all(void)
 {
 {
 	wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, x86_pmu.intel_ctrl);
 	wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, x86_pmu.intel_ctrl);
@@ -784,13 +874,13 @@ static void amd_pmu_enable_all(void)
 	barrier();
 	barrier();
 
 
 	for (idx = 0; idx < x86_pmu.num_counters; idx++) {
 	for (idx = 0; idx < x86_pmu.num_counters; idx++) {
+		struct perf_counter *counter = cpuc->counters[idx];
 		u64 val;
 		u64 val;
 
 
 		if (!test_bit(idx, cpuc->active_mask))
 		if (!test_bit(idx, cpuc->active_mask))
 			continue;
 			continue;
-		rdmsrl(MSR_K7_EVNTSEL0 + idx, val);
-		if (val & ARCH_PERFMON_EVENTSEL0_ENABLE)
-			continue;
+
+		val = counter->hw.config;
 		val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
 		val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
 		wrmsrl(MSR_K7_EVNTSEL0 + idx, val);
 		wrmsrl(MSR_K7_EVNTSEL0 + idx, val);
 	}
 	}
@@ -819,16 +909,13 @@ static inline void intel_pmu_ack_status(u64 ack)
 
 
 static inline void x86_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
 static inline void x86_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
 {
 {
-	int err;
-	err = checking_wrmsrl(hwc->config_base + idx,
+	(void)checking_wrmsrl(hwc->config_base + idx,
 			      hwc->config | ARCH_PERFMON_EVENTSEL0_ENABLE);
 			      hwc->config | ARCH_PERFMON_EVENTSEL0_ENABLE);
 }
 }
 
 
 static inline void x86_pmu_disable_counter(struct hw_perf_counter *hwc, int idx)
 static inline void x86_pmu_disable_counter(struct hw_perf_counter *hwc, int idx)
 {
 {
-	int err;
-	err = checking_wrmsrl(hwc->config_base + idx,
-			      hwc->config);
+	(void)checking_wrmsrl(hwc->config_base + idx, hwc->config);
 }
 }
 
 
 static inline void
 static inline void
@@ -836,13 +923,24 @@ intel_pmu_disable_fixed(struct hw_perf_counter *hwc, int __idx)
 {
 {
 	int idx = __idx - X86_PMC_IDX_FIXED;
 	int idx = __idx - X86_PMC_IDX_FIXED;
 	u64 ctrl_val, mask;
 	u64 ctrl_val, mask;
-	int err;
 
 
 	mask = 0xfULL << (idx * 4);
 	mask = 0xfULL << (idx * 4);
 
 
 	rdmsrl(hwc->config_base, ctrl_val);
 	rdmsrl(hwc->config_base, ctrl_val);
 	ctrl_val &= ~mask;
 	ctrl_val &= ~mask;
-	err = checking_wrmsrl(hwc->config_base, ctrl_val);
+	(void)checking_wrmsrl(hwc->config_base, ctrl_val);
+}
+
+static inline void
+p6_pmu_disable_counter(struct hw_perf_counter *hwc, int idx)
+{
+	struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters);
+	u64 val = P6_NOP_COUNTER;
+
+	if (cpuc->enabled)
+		val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
+
+	(void)checking_wrmsrl(hwc->config_base + idx, val);
 }
 }
 
 
 static inline void
 static inline void
@@ -943,6 +1041,19 @@ intel_pmu_enable_fixed(struct hw_perf_counter *hwc, int __idx)
 	err = checking_wrmsrl(hwc->config_base, ctrl_val);
 	err = checking_wrmsrl(hwc->config_base, ctrl_val);
 }
 }
 
 
+static void p6_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
+{
+	struct cpu_hw_counters *cpuc = &__get_cpu_var(cpu_hw_counters);
+	u64 val;
+
+	val = hwc->config;
+	if (cpuc->enabled)
+		val |= ARCH_PERFMON_EVENTSEL0_ENABLE;
+
+	(void)checking_wrmsrl(hwc->config_base + idx, val);
+}
+
+
 static void intel_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
 static void intel_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
 {
 {
 	if (unlikely(hwc->config_base == MSR_ARCH_PERFMON_FIXED_CTR_CTRL)) {
 	if (unlikely(hwc->config_base == MSR_ARCH_PERFMON_FIXED_CTR_CTRL)) {
@@ -959,8 +1070,6 @@ static void amd_pmu_enable_counter(struct hw_perf_counter *hwc, int idx)
 
 
 	if (cpuc->enabled)
 	if (cpuc->enabled)
 		x86_pmu_enable_counter(hwc, idx);
 		x86_pmu_enable_counter(hwc, idx);
-	else
-		x86_pmu_disable_counter(hwc, idx);
 }
 }
 
 
 static int
 static int
@@ -1176,6 +1285,49 @@ static void intel_pmu_reset(void)
 	local_irq_restore(flags);
 	local_irq_restore(flags);
 }
 }
 
 
+static int p6_pmu_handle_irq(struct pt_regs *regs)
+{
+	struct perf_sample_data data;
+	struct cpu_hw_counters *cpuc;
+	struct perf_counter *counter;
+	struct hw_perf_counter *hwc;
+	int idx, handled = 0;
+	u64 val;
+
+	data.regs = regs;
+	data.addr = 0;
+
+	cpuc = &__get_cpu_var(cpu_hw_counters);
+
+	for (idx = 0; idx < x86_pmu.num_counters; idx++) {
+		if (!test_bit(idx, cpuc->active_mask))
+			continue;
+
+		counter = cpuc->counters[idx];
+		hwc = &counter->hw;
+
+		val = x86_perf_counter_update(counter, hwc, idx);
+		if (val & (1ULL << (x86_pmu.counter_bits - 1)))
+			continue;
+
+		/*
+		 * counter overflow
+		 */
+		handled		= 1;
+		data.period	= counter->hw.last_period;
+
+		if (!x86_perf_counter_set_period(counter, hwc, idx))
+			continue;
+
+		if (perf_counter_overflow(counter, 1, &data))
+			p6_pmu_disable_counter(hwc, idx);
+	}
+
+	if (handled)
+		inc_irq_stat(apic_perf_irqs);
+
+	return handled;
+}
 
 
 /*
 /*
  * This handler is triggered by the local APIC, so the APIC IRQ handling
  * This handler is triggered by the local APIC, so the APIC IRQ handling
@@ -1185,14 +1337,13 @@ static int intel_pmu_handle_irq(struct pt_regs *regs)
 {
 {
 	struct perf_sample_data data;
 	struct perf_sample_data data;
 	struct cpu_hw_counters *cpuc;
 	struct cpu_hw_counters *cpuc;
-	int bit, cpu, loops;
+	int bit, loops;
 	u64 ack, status;
 	u64 ack, status;
 
 
 	data.regs = regs;
 	data.regs = regs;
 	data.addr = 0;
 	data.addr = 0;
 
 
-	cpu = smp_processor_id();
-	cpuc = &per_cpu(cpu_hw_counters, cpu);
+	cpuc = &__get_cpu_var(cpu_hw_counters);
 
 
 	perf_disable();
 	perf_disable();
 	status = intel_pmu_get_status();
 	status = intel_pmu_get_status();
@@ -1249,14 +1400,13 @@ static int amd_pmu_handle_irq(struct pt_regs *regs)
 	struct cpu_hw_counters *cpuc;
 	struct cpu_hw_counters *cpuc;
 	struct perf_counter *counter;
 	struct perf_counter *counter;
 	struct hw_perf_counter *hwc;
 	struct hw_perf_counter *hwc;
-	int cpu, idx, handled = 0;
+	int idx, handled = 0;
 	u64 val;
 	u64 val;
 
 
 	data.regs = regs;
 	data.regs = regs;
 	data.addr = 0;
 	data.addr = 0;
 
 
-	cpu = smp_processor_id();
-	cpuc = &per_cpu(cpu_hw_counters, cpu);
+	cpuc = &__get_cpu_var(cpu_hw_counters);
 
 
 	for (idx = 0; idx < x86_pmu.num_counters; idx++) {
 	for (idx = 0; idx < x86_pmu.num_counters; idx++) {
 		if (!test_bit(idx, cpuc->active_mask))
 		if (!test_bit(idx, cpuc->active_mask))
@@ -1353,6 +1503,32 @@ static __read_mostly struct notifier_block perf_counter_nmi_notifier = {
 	.priority		= 1
 	.priority		= 1
 };
 };
 
 
+static struct x86_pmu p6_pmu = {
+	.name			= "p6",
+	.handle_irq		= p6_pmu_handle_irq,
+	.disable_all		= p6_pmu_disable_all,
+	.enable_all		= p6_pmu_enable_all,
+	.enable			= p6_pmu_enable_counter,
+	.disable		= p6_pmu_disable_counter,
+	.eventsel		= MSR_P6_EVNTSEL0,
+	.perfctr		= MSR_P6_PERFCTR0,
+	.event_map		= p6_pmu_event_map,
+	.raw_event		= p6_pmu_raw_event,
+	.max_events		= ARRAY_SIZE(p6_perfmon_event_map),
+	.max_period		= (1ULL << 31) - 1,
+	.version		= 0,
+	.num_counters		= 2,
+	/*
+	 * Counters have 40 bits implemented. However they are designed such
+	 * that bits [32-39] are sign extensions of bit 31. As such the
+	 * effective width of a counter for P6-like PMU is 32 bits only.
+	 *
+	 * See IA-32 Intel Architecture Software developer manual Vol 3B
+	 */
+	.counter_bits		= 32,
+	.counter_mask		= (1ULL << 32) - 1,
+};
+
 static struct x86_pmu intel_pmu = {
 static struct x86_pmu intel_pmu = {
 	.name			= "Intel",
 	.name			= "Intel",
 	.handle_irq		= intel_pmu_handle_irq,
 	.handle_irq		= intel_pmu_handle_irq,
@@ -1392,6 +1568,37 @@ static struct x86_pmu amd_pmu = {
 	.max_period		= (1ULL << 47) - 1,
 	.max_period		= (1ULL << 47) - 1,
 };
 };
 
 
+static int p6_pmu_init(void)
+{
+	switch (boot_cpu_data.x86_model) {
+	case 1:
+	case 3:  /* Pentium Pro */
+	case 5:
+	case 6:  /* Pentium II */
+	case 7:
+	case 8:
+	case 11: /* Pentium III */
+		break;
+	case 9:
+	case 13:
+		/* Pentium M */
+		break;
+	default:
+		pr_cont("unsupported p6 CPU model %d ",
+			boot_cpu_data.x86_model);
+		return -ENODEV;
+	}
+
+	if (!cpu_has_apic) {
+		pr_info("no Local APIC, try rebooting with lapic");
+		return -ENODEV;
+	}
+
+	x86_pmu				= p6_pmu;
+
+	return 0;
+}
+
 static int intel_pmu_init(void)
 static int intel_pmu_init(void)
 {
 {
 	union cpuid10_edx edx;
 	union cpuid10_edx edx;
@@ -1400,8 +1607,14 @@ static int intel_pmu_init(void)
 	unsigned int ebx;
 	unsigned int ebx;
 	int version;
 	int version;
 
 
-	if (!cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON))
+	if (!cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON)) {
+		/* check for P6 processor family */
+	   if (boot_cpu_data.x86 == 6) {
+		return p6_pmu_init();
+	   } else {
 		return -ENODEV;
 		return -ENODEV;
+	   }
+	}
 
 
 	/*
 	/*
 	 * Check whether the Architectural PerfMon supports
 	 * Check whether the Architectural PerfMon supports

+ 1 - 1
arch/x86/kernel/irqinit.c

@@ -187,7 +187,7 @@ static void __init apic_intr_init(void)
 #ifdef CONFIG_X86_THERMAL_VECTOR
 #ifdef CONFIG_X86_THERMAL_VECTOR
 	alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt);
 	alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt);
 #endif
 #endif
-#ifdef CONFIG_X86_THRESHOLD
+#ifdef CONFIG_X86_MCE_THRESHOLD
 	alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt);
 	alloc_intr_gate(THRESHOLD_APIC_VECTOR, threshold_interrupt);
 #endif
 #endif
 #if defined(CONFIG_X86_NEW_MCE) && defined(CONFIG_X86_LOCAL_APIC)
 #if defined(CONFIG_X86_NEW_MCE) && defined(CONFIG_X86_LOCAL_APIC)

+ 1 - 1
arch/x86/kernel/mfgpt_32.c

@@ -347,7 +347,7 @@ static irqreturn_t mfgpt_tick(int irq, void *dev_id)
 
 
 static struct irqaction mfgptirq  = {
 static struct irqaction mfgptirq  = {
 	.handler = mfgpt_tick,
 	.handler = mfgpt_tick,
-	.flags = IRQF_DISABLED | IRQF_NOBALANCING,
+	.flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TIMER,
 	.name = "mfgpt-timer"
 	.name = "mfgpt-timer"
 };
 };
 
 

+ 8 - 0
arch/x86/kernel/reboot.c

@@ -249,6 +249,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
 			DMI_MATCH(DMI_PRODUCT_NAME, "VGN-Z540N"),
 			DMI_MATCH(DMI_PRODUCT_NAME, "VGN-Z540N"),
 		},
 		},
 	},
 	},
+	{	/* Handle problems with rebooting on CompuLab SBC-FITPC2 */
+		.callback = set_bios_reboot,
+		.ident = "CompuLab SBC-FITPC2",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "CompuLab"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "SBC-FITPC2"),
+		},
+	},
 	{ }
 	{ }
 };
 };
 
 

+ 13 - 0
arch/x86/kernel/setup.c

@@ -672,6 +672,19 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = {
 			DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"),
 			DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"),
 		},
 		},
 	},
 	},
+	{
+	/*
+	 * AMI BIOS with low memory corruption was found on Intel DG45ID board.
+	 * It hase different DMI_BIOS_VENDOR = "Intel Corp.", for now we will
+	 * match only DMI_BOARD_NAME and see if there is more bad products
+	 * with this vendor.
+	 */
+		.callback = dmi_low_memory_corruption,
+		.ident = "AMI BIOS",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_NAME, "DG45ID"),
+		},
+	},
 #endif
 #endif
 	{}
 	{}
 };
 };

+ 0 - 7
arch/x86/kernel/vmlinux.lds.S

@@ -112,11 +112,6 @@ SECTIONS
 		_sdata = .;
 		_sdata = .;
 		DATA_DATA
 		DATA_DATA
 		CONSTRUCTORS
 		CONSTRUCTORS
-
-#ifdef CONFIG_X86_64
-		/* End of data section */
-		_edata = .;
-#endif
 	} :data
 	} :data
 
 
 #ifdef CONFIG_X86_32
 #ifdef CONFIG_X86_32
@@ -156,10 +151,8 @@ SECTIONS
 	.data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
 	.data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
 		*(.data.read_mostly)
 		*(.data.read_mostly)
 
 
-#ifdef CONFIG_X86_32
 		/* End of data section */
 		/* End of data section */
 		_edata = .;
 		_edata = .;
-#endif
 	}
 	}
 
 
 #ifdef CONFIG_X86_64
 #ifdef CONFIG_X86_64

+ 3 - 3
arch/x86/mm/pgtable.c

@@ -25,7 +25,7 @@ pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address)
 	return pte;
 	return pte;
 }
 }
 
 
-void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte)
+void ___pte_free_tlb(struct mmu_gather *tlb, struct page *pte)
 {
 {
 	pgtable_page_dtor(pte);
 	pgtable_page_dtor(pte);
 	paravirt_release_pte(page_to_pfn(pte));
 	paravirt_release_pte(page_to_pfn(pte));
@@ -33,14 +33,14 @@ void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte)
 }
 }
 
 
 #if PAGETABLE_LEVELS > 2
 #if PAGETABLE_LEVELS > 2
-void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
+void ___pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
 {
 {
 	paravirt_release_pmd(__pa(pmd) >> PAGE_SHIFT);
 	paravirt_release_pmd(__pa(pmd) >> PAGE_SHIFT);
 	tlb_remove_page(tlb, virt_to_page(pmd));
 	tlb_remove_page(tlb, virt_to_page(pmd));
 }
 }
 
 
 #if PAGETABLE_LEVELS > 3
 #if PAGETABLE_LEVELS > 3
-void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud)
+void ___pud_free_tlb(struct mmu_gather *tlb, pud_t *pud)
 {
 {
 	paravirt_release_pud(__pa(pud) >> PAGE_SHIFT);
 	paravirt_release_pud(__pa(pud) >> PAGE_SHIFT);
 	tlb_remove_page(tlb, virt_to_page(pud));
 	tlb_remove_page(tlb, virt_to_page(pud));

+ 4 - 2
arch/x86/mm/srat_64.c

@@ -79,8 +79,10 @@ static __init void bad_srat(void)
 	acpi_numa = -1;
 	acpi_numa = -1;
 	for (i = 0; i < MAX_LOCAL_APIC; i++)
 	for (i = 0; i < MAX_LOCAL_APIC; i++)
 		apicid_to_node[i] = NUMA_NO_NODE;
 		apicid_to_node[i] = NUMA_NO_NODE;
-	for (i = 0; i < MAX_NUMNODES; i++)
-		nodes_add[i].start = nodes[i].end = 0;
+	for (i = 0; i < MAX_NUMNODES; i++) {
+		nodes[i].start = nodes[i].end = 0;
+		nodes_add[i].start = nodes_add[i].end = 0;
+	}
 	remove_all_active_ranges();
 	remove_all_active_ranges();
 }
 }
 
 

+ 1 - 1
arch/xtensa/include/asm/tlb.h

@@ -42,6 +42,6 @@
 
 
 #include <asm-generic/tlb.h>
 #include <asm-generic/tlb.h>
 
 
-#define __pte_free_tlb(tlb, pte)		pte_free((tlb)->mm, pte)
+#define __pte_free_tlb(tlb, pte, address)	pte_free((tlb)->mm, pte)
 
 
 #endif	/* _XTENSA_TLB_H */
 #endif	/* _XTENSA_TLB_H */

+ 6 - 5
block/blk-sysfs.c

@@ -16,9 +16,9 @@ struct queue_sysfs_entry {
 };
 };
 
 
 static ssize_t
 static ssize_t
-queue_var_show(unsigned int var, char *page)
+queue_var_show(unsigned long var, char *page)
 {
 {
-	return sprintf(page, "%d\n", var);
+	return sprintf(page, "%lu\n", var);
 }
 }
 
 
 static ssize_t
 static ssize_t
@@ -77,7 +77,8 @@ queue_requests_store(struct request_queue *q, const char *page, size_t count)
 
 
 static ssize_t queue_ra_show(struct request_queue *q, char *page)
 static ssize_t queue_ra_show(struct request_queue *q, char *page)
 {
 {
-	int ra_kb = q->backing_dev_info.ra_pages << (PAGE_CACHE_SHIFT - 10);
+	unsigned long ra_kb = q->backing_dev_info.ra_pages <<
+					(PAGE_CACHE_SHIFT - 10);
 
 
 	return queue_var_show(ra_kb, (page));
 	return queue_var_show(ra_kb, (page));
 }
 }
@@ -189,9 +190,9 @@ static ssize_t queue_nomerges_store(struct request_queue *q, const char *page,
 
 
 static ssize_t queue_rq_affinity_show(struct request_queue *q, char *page)
 static ssize_t queue_rq_affinity_show(struct request_queue *q, char *page)
 {
 {
-	unsigned int set = test_bit(QUEUE_FLAG_SAME_COMP, &q->queue_flags);
+	bool set = test_bit(QUEUE_FLAG_SAME_COMP, &q->queue_flags);
 
 
-	return queue_var_show(set != 0, page);
+	return queue_var_show(set, page);
 }
 }
 
 
 static ssize_t
 static ssize_t

+ 9 - 4
block/elevator.c

@@ -101,11 +101,16 @@ int elv_rq_merge_ok(struct request *rq, struct bio *bio)
 		return 0;
 		return 0;
 
 
 	/*
 	/*
-	 * Don't merge if failfast settings don't match
+	 * Don't merge if failfast settings don't match.
+	 *
+	 * FIXME: The negation in front of each condition is necessary
+	 * because bio and request flags use different bit positions
+	 * and the accessors return those bits directly.  This
+	 * ugliness will soon go away.
 	 */
 	 */
-	if (bio_failfast_dev(bio)	!= blk_failfast_dev(rq)		||
-	    bio_failfast_transport(bio)	!= blk_failfast_transport(rq)	||
-	    bio_failfast_driver(bio)	!= blk_failfast_driver(rq))
+	if (!bio_failfast_dev(bio)	 != !blk_failfast_dev(rq)	||
+	    !bio_failfast_transport(bio) != !blk_failfast_transport(rq)	||
+	    !bio_failfast_driver(bio)	 != !blk_failfast_driver(rq))
 		return 0;
 		return 0;
 
 
 	if (!elv_iosched_allow_merge(rq, bio))
 	if (!elv_iosched_allow_merge(rq, bio))

+ 1 - 1
drivers/block/ataflop.c

@@ -1627,7 +1627,7 @@ static int fd_ioctl(struct block_device *bdev, fmode_t mode,
 				drive, dtp->blocks, dtp->spt, dtp->stretch);
 				drive, dtp->blocks, dtp->spt, dtp->stretch);
 
 
 		/* sanity check */
 		/* sanity check */
-		if (!dtp || setprm.track != dtp->blocks/dtp->spt/2 ||
+		if (setprm.track != dtp->blocks/dtp->spt/2 ||
 		    setprm.head != 2) {
 		    setprm.head != 2) {
 			redo_fd_request();
 			redo_fd_request();
 			return -EINVAL;
 			return -EINVAL;

+ 6 - 1
drivers/block/virtio_blk.c

@@ -427,7 +427,12 @@ static unsigned int features[] = {
 	VIRTIO_BLK_F_SCSI, VIRTIO_BLK_F_IDENTIFY
 	VIRTIO_BLK_F_SCSI, VIRTIO_BLK_F_IDENTIFY
 };
 };
 
 
-static struct virtio_driver virtio_blk = {
+/*
+ * virtio_blk causes spurious section mismatch warning by
+ * simultaneously referring to a __devinit and a __devexit function.
+ * Use __refdata to avoid this warning.
+ */
+static struct virtio_driver __refdata virtio_blk = {
 	.feature_table = features,
 	.feature_table = features,
 	.feature_table_size = ARRAY_SIZE(features),
 	.feature_table_size = ARRAY_SIZE(features),
 	.driver.name =	KBUILD_MODNAME,
 	.driver.name =	KBUILD_MODNAME,

+ 1 - 1
drivers/block/z2ram.c

@@ -374,7 +374,7 @@ err:
 static void __exit z2_exit(void)
 static void __exit z2_exit(void)
 {
 {
     int i, j;
     int i, j;
-    blk_unregister_region(MKDEV(Z2RAM_MAJOR, 0), 256);
+    blk_unregister_region(MKDEV(Z2RAM_MAJOR, 0), Z2MINOR_COUNT);
     unregister_blkdev(Z2RAM_MAJOR, DEVICE_NAME);
     unregister_blkdev(Z2RAM_MAJOR, DEVICE_NAME);
     del_gendisk(z2ram_gendisk);
     del_gendisk(z2ram_gendisk);
     put_disk(z2ram_gendisk);
     put_disk(z2ram_gendisk);

+ 2 - 0
drivers/char/pty.c

@@ -52,6 +52,7 @@ static void pty_close(struct tty_struct *tty, struct file *filp)
 		return;
 		return;
 	tty->link->packet = 0;
 	tty->link->packet = 0;
 	set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
 	set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
+	tty_flip_buffer_push(tty->link);
 	wake_up_interruptible(&tty->link->read_wait);
 	wake_up_interruptible(&tty->link->read_wait);
 	wake_up_interruptible(&tty->link->write_wait);
 	wake_up_interruptible(&tty->link->write_wait);
 	if (tty->driver->subtype == PTY_TYPE_MASTER) {
 	if (tty->driver->subtype == PTY_TYPE_MASTER) {
@@ -207,6 +208,7 @@ static int pty_open(struct tty_struct *tty, struct file *filp)
 	clear_bit(TTY_OTHER_CLOSED, &tty->link->flags);
 	clear_bit(TTY_OTHER_CLOSED, &tty->link->flags);
 	set_bit(TTY_THROTTLED, &tty->flags);
 	set_bit(TTY_THROTTLED, &tty->flags);
 	retval = 0;
 	retval = 0;
+	tty->low_latency = 1;
 out:
 out:
 	return retval;
 	return retval;
 }
 }

+ 1 - 1
drivers/connector/cn_queue.c

@@ -1,7 +1,7 @@
 /*
 /*
  * 	cn_queue.c
  * 	cn_queue.c
  *
  *
- * 2004-2005 Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
+ * 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>
  * All rights reserved.
  * All rights reserved.
  *
  *
  * This program is free software; you can redistribute it and/or modify
  * This program is free software; you can redistribute it and/or modify

+ 2 - 2
drivers/connector/connector.c

@@ -1,7 +1,7 @@
 /*
 /*
  * 	connector.c
  * 	connector.c
  *
  *
- * 2004-2005 Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
+ * 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>
  * All rights reserved.
  * All rights reserved.
  *
  *
  * This program is free software; you can redistribute it and/or modify
  * This program is free software; you can redistribute it and/or modify
@@ -33,7 +33,7 @@
 #include <net/sock.h>
 #include <net/sock.h>
 
 
 MODULE_LICENSE("GPL");
 MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>");
+MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
 MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector.");
 MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector.");
 
 
 static u32 cn_idx = CN_IDX_CONNECTOR;
 static u32 cn_idx = CN_IDX_CONNECTOR;

+ 1 - 1
drivers/edac/amd64_edac.c

@@ -970,7 +970,7 @@ static void amd64_read_dct_base_mask(struct amd64_pvt *pvt)
 	}
 	}
 
 
 	for (cs = 0; cs < pvt->num_dcsm; cs++) {
 	for (cs = 0; cs < pvt->num_dcsm; cs++) {
-		reg = K8_DCSB0 + (cs * 4);
+		reg = K8_DCSM0 + (cs * 4);
 		err = pci_read_config_dword(pvt->dram_f2_ctl, reg,
 		err = pci_read_config_dword(pvt->dram_f2_ctl, reg,
 					&pvt->dcsm0[cs]);
 					&pvt->dcsm0[cs]);
 		if (unlikely(err))
 		if (unlikely(err))

+ 4 - 2
drivers/hid/hid-core.c

@@ -1075,14 +1075,16 @@ EXPORT_SYMBOL_GPL(hid_report_raw_event);
  */
  */
 int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int interrupt)
 int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int interrupt)
 {
 {
-	struct hid_report_enum *report_enum = hid->report_enum + type;
-	struct hid_driver *hdrv = hid->driver;
+	struct hid_report_enum *report_enum;
+	struct hid_driver *hdrv;
 	struct hid_report *report;
 	struct hid_report *report;
 	unsigned int i;
 	unsigned int i;
 	int ret;
 	int ret;
 
 
 	if (!hid || !hid->driver)
 	if (!hid || !hid->driver)
 		return -ENODEV;
 		return -ENODEV;
+	report_enum = hid->report_enum + type;
+	hdrv = hid->driver;
 
 
 	if (!size) {
 	if (!size) {
 		dbg_hid("empty report\n");
 		dbg_hid("empty report\n");

+ 3 - 1
drivers/hid/usbhid/hiddev.c

@@ -527,8 +527,10 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
 			goto goodreturn;
 			goto goodreturn;
 
 
 		case HIDIOCGCOLLECTIONINDEX:
 		case HIDIOCGCOLLECTIONINDEX:
+			i = field->usage[uref->usage_index].collection_index;
+			unlock_kernel();
 			kfree(uref_multi);
 			kfree(uref_multi);
-			return field->usage[uref->usage_index].collection_index;
+			return i;
 		case HIDIOCGUSAGES:
 		case HIDIOCGUSAGES:
 			for (i = 0; i < uref_multi->num_values; i++)
 			for (i = 0; i < uref_multi->num_values; i++)
 				uref_multi->values[i] =
 				uref_multi->values[i] =

+ 5 - 1
drivers/hwmon/asus_atk0110.c

@@ -593,7 +593,11 @@ static int atk_add_sensor(struct atk_data *data, union acpi_object *obj)
 	sensor->data = data;
 	sensor->data = data;
 	sensor->id = flags->integer.value;
 	sensor->id = flags->integer.value;
 	sensor->limit1 = limit1->integer.value;
 	sensor->limit1 = limit1->integer.value;
-	sensor->limit2 = limit2->integer.value;
+	if (data->old_interface)
+		sensor->limit2 = limit2->integer.value;
+	else
+		/* The upper limit is expressed as delta from lower limit */
+		sensor->limit2 = sensor->limit1 + limit2->integer.value;
 
 
 	snprintf(sensor->input_attr_name, ATTR_NAME_SIZE,
 	snprintf(sensor->input_attr_name, ATTR_NAME_SIZE,
 			"%s%d_input", base_name, start + *num);
 			"%s%d_input", base_name, start + *num);

+ 11 - 0
drivers/hwmon/smsc47m1.c

@@ -86,6 +86,7 @@ superio_exit(void)
 #define SUPERIO_REG_ACT		0x30
 #define SUPERIO_REG_ACT		0x30
 #define SUPERIO_REG_BASE	0x60
 #define SUPERIO_REG_BASE	0x60
 #define SUPERIO_REG_DEVID	0x20
 #define SUPERIO_REG_DEVID	0x20
+#define SUPERIO_REG_DEVREV	0x21
 
 
 /* Logical device registers */
 /* Logical device registers */
 
 
@@ -429,6 +430,9 @@ static int __init smsc47m1_find(unsigned short *addr,
 	 * The LPC47M292 (device id 0x6B) is somewhat compatible, but it
 	 * The LPC47M292 (device id 0x6B) is somewhat compatible, but it
 	 * supports a 3rd fan, and the pin configuration registers are
 	 * supports a 3rd fan, and the pin configuration registers are
 	 * unfortunately different.
 	 * unfortunately different.
+	 * The LPC47M233 has the same device id (0x6B) but is not compatible.
+	 * We check the high bit of the device revision register to
+	 * differentiate them.
 	 */
 	 */
 	switch (val) {
 	switch (val) {
 	case 0x51:
 	case 0x51:
@@ -448,6 +452,13 @@ static int __init smsc47m1_find(unsigned short *addr,
 		sio_data->type = smsc47m1;
 		sio_data->type = smsc47m1;
 		break;
 		break;
 	case 0x6B:
 	case 0x6B:
+		if (superio_inb(SUPERIO_REG_DEVREV) & 0x80) {
+			pr_debug(DRVNAME ": "
+				 "Found SMSC LPC47M233, unsupported\n");
+			superio_exit();
+			return -ENODEV;
+		}
+
 		pr_info(DRVNAME ": Found SMSC LPC47M292\n");
 		pr_info(DRVNAME ": Found SMSC LPC47M292\n");
 		sio_data->type = smsc47m2;
 		sio_data->type = smsc47m2;
 		break;
 		break;

+ 10 - 7
drivers/i2c/chips/tsl2550.c

@@ -27,7 +27,7 @@
 #include <linux/delay.h>
 #include <linux/delay.h>
 
 
 #define TSL2550_DRV_NAME	"tsl2550"
 #define TSL2550_DRV_NAME	"tsl2550"
-#define DRIVER_VERSION		"1.1.1"
+#define DRIVER_VERSION		"1.1.2"
 
 
 /*
 /*
  * Defines
  * Defines
@@ -189,13 +189,16 @@ static int tsl2550_calculate_lux(u8 ch0, u8 ch1)
 	u8 r = 128;
 	u8 r = 128;
 
 
 	/* Avoid division by 0 and count 1 cannot be greater than count 0 */
 	/* Avoid division by 0 and count 1 cannot be greater than count 0 */
-	if (c0 && (c1 <= c0))
-		r = c1 * 128 / c0;
+	if (c1 <= c0)
+		if (c0) {
+			r = c1 * 128 / c0;
+
+			/* Calculate LUX */
+			lux = ((c0 - c1) * ratio_lut[r]) / 256;
+		} else
+			lux = 0;
 	else
 	else
-		return -1;
-
-	/* Calculate LUX */
-	lux = ((c0 - c1) * ratio_lut[r]) / 256;
+		return -EAGAIN;
 
 
 	/* LUX range check */
 	/* LUX range check */
 	return lux > TSL2550_MAX_LUX ? TSL2550_MAX_LUX : lux;
 	return lux > TSL2550_MAX_LUX ? TSL2550_MAX_LUX : lux;

+ 1 - 0
drivers/ide/ide-disk.c

@@ -455,6 +455,7 @@ static void idedisk_prepare_flush(struct request_queue *q, struct request *rq)
 
 
 	rq->cmd_type = REQ_TYPE_ATA_TASKFILE;
 	rq->cmd_type = REQ_TYPE_ATA_TASKFILE;
 	rq->special = cmd;
 	rq->special = cmd;
+	cmd->rq = rq;
 }
 }
 
 
 ide_devset_get(multcount, mult_count);
 ide_devset_get(multcount, mult_count);

+ 1 - 0
drivers/ide/ide-tape.c

@@ -1064,6 +1064,7 @@ static int idetape_blkdev_ioctl(ide_drive_t *drive, unsigned int cmd,
 		tape->best_dsc_rw_freq = config.dsc_rw_frequency;
 		tape->best_dsc_rw_freq = config.dsc_rw_frequency;
 		break;
 		break;
 	case 0x0350:
 	case 0x0350:
+		memset(&config, 0, sizeof(config));
 		config.dsc_rw_frequency = (int) tape->best_dsc_rw_freq;
 		config.dsc_rw_frequency = (int) tape->best_dsc_rw_freq;
 		config.nr_stages = 1;
 		config.nr_stages = 1;
 		if (copy_to_user(argp, &config, sizeof(config)))
 		if (copy_to_user(argp, &config, sizeof(config)))

+ 1 - 2
drivers/input/evdev.c

@@ -608,8 +608,7 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
 						    p, compat_mode);
 						    p, compat_mode);
 
 
 			if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0)))
 			if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0)))
-				return str_to_user(dev_name(&evdev->dev),
-						   _IOC_SIZE(cmd), p);
+				return str_to_user(dev->name, _IOC_SIZE(cmd), p);
 
 
 			if (_IOC_NR(cmd) == _IOC_NR(EVIOCGPHYS(0)))
 			if (_IOC_NR(cmd) == _IOC_NR(EVIOCGPHYS(0)))
 				return str_to_user(dev->phys, _IOC_SIZE(cmd), p);
 				return str_to_user(dev->phys, _IOC_SIZE(cmd), p);

+ 1 - 1
drivers/input/joydev.c

@@ -536,7 +536,7 @@ static int joydev_ioctl_common(struct joydev *joydev,
 	default:
 	default:
 		if ((cmd & ~IOCSIZE_MASK) == JSIOCGNAME(0)) {
 		if ((cmd & ~IOCSIZE_MASK) == JSIOCGNAME(0)) {
 			int len;
 			int len;
-			const char *name = dev_name(&dev->dev);
+			const char *name = dev->name;
 
 
 			if (!name)
 			if (!name)
 				return 0;
 				return 0;

+ 13 - 13
drivers/input/joystick/xpad.c

@@ -470,20 +470,20 @@ static void xpad_irq_out(struct urb *urb)
 	status = urb->status;
 	status = urb->status;
 
 
 	switch (status) {
 	switch (status) {
-		case 0:
+	case 0:
 		/* success */
 		/* success */
-		break;
-		case -ECONNRESET:
-		case -ENOENT:
-		case -ESHUTDOWN:
-			/* this urb is terminated, clean up */
-			dbg("%s - urb shutting down with status: %d",
-				__func__, status);
-			return;
-		default:
-			dbg("%s - nonzero urb status received: %d",
-				__func__, status);
-			goto exit;
+		return;
+
+	case -ECONNRESET:
+	case -ENOENT:
+	case -ESHUTDOWN:
+		/* this urb is terminated, clean up */
+		dbg("%s - urb shutting down with status: %d", __func__, status);
+		return;
+
+	default:
+		dbg("%s - nonzero urb status received: %d", __func__, status);
+		goto exit;
 	}
 	}
 
 
 exit:
 exit:

+ 32 - 0
drivers/input/keyboard/atkbd.c

@@ -894,6 +894,13 @@ static unsigned int atkbd_amilo_pa1510_forced_release_keys[] = {
 	0xb0, 0xae, -1U
 	0xb0, 0xae, -1U
 };
 };
 
 
+/*
+ * Amilo Pi 3525 key release for Fn+Volume keys not working
+ */
+static unsigned int atkbd_amilo_pi3525_forced_release_keys[] = {
+	0x20, 0xa0, 0x2e, 0xae, 0x30, 0xb0, -1U
+};
+
 /*
 /*
  * Amilo Xi 3650 key release for light touch bar not working
  * Amilo Xi 3650 key release for light touch bar not working
  */
  */
@@ -901,6 +908,13 @@ static unsigned int atkbd_amilo_xi3650_forced_release_keys[] = {
 	0x67, 0xed, 0x90, 0xa2, 0x99, 0xa4, 0xae, 0xb0, -1U
 	0x67, 0xed, 0x90, 0xa2, 0x99, 0xa4, 0xae, 0xb0, -1U
 };
 };
 
 
+/*
+ * Soltech TA12 system with broken key release on volume keys and mute key
+ */
+static unsigned int atkdb_soltech_ta12_forced_release_keys[] = {
+	0xa0, 0xae, 0xb0, -1U
+};
+
 /*
 /*
  * atkbd_set_keycode_table() initializes keyboard's keycode table
  * atkbd_set_keycode_table() initializes keyboard's keycode table
  * according to the selected scancode set
  * according to the selected scancode set
@@ -1567,6 +1581,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
 		.callback = atkbd_setup_forced_release,
 		.callback = atkbd_setup_forced_release,
 		.driver_data = atkbd_amilo_pa1510_forced_release_keys,
 		.driver_data = atkbd_amilo_pa1510_forced_release_keys,
 	},
 	},
+	{
+		.ident = "Fujitsu Amilo Pi 3525",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 3525"),
+		},
+		.callback = atkbd_setup_forced_release,
+		.driver_data = atkbd_amilo_pi3525_forced_release_keys,
+	},
 	{
 	{
 		.ident = "Fujitsu Amilo Xi 3650",
 		.ident = "Fujitsu Amilo Xi 3650",
 		.matches = {
 		.matches = {
@@ -1576,6 +1599,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
 		.callback = atkbd_setup_forced_release,
 		.callback = atkbd_setup_forced_release,
 		.driver_data = atkbd_amilo_xi3650_forced_release_keys,
 		.driver_data = atkbd_amilo_xi3650_forced_release_keys,
 	},
 	},
+	{
+		.ident = "Soltech Corporation TA12",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "Soltech Corporation"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "TA12"),
+		},
+		.callback = atkbd_setup_forced_release,
+		.driver_data = atkdb_soltech_ta12_forced_release_keys,
+	},
 	{ }
 	{ }
 };
 };
 
 

+ 6 - 2
drivers/input/misc/pcspkr.c

@@ -114,7 +114,7 @@ static int __devexit pcspkr_remove(struct platform_device *dev)
 	return 0;
 	return 0;
 }
 }
 
 
-static int pcspkr_suspend(struct platform_device *dev, pm_message_t state)
+static int pcspkr_suspend(struct device *dev)
 {
 {
 	pcspkr_event(NULL, EV_SND, SND_BELL, 0);
 	pcspkr_event(NULL, EV_SND, SND_BELL, 0);
 
 
@@ -127,14 +127,18 @@ static void pcspkr_shutdown(struct platform_device *dev)
 	pcspkr_event(NULL, EV_SND, SND_BELL, 0);
 	pcspkr_event(NULL, EV_SND, SND_BELL, 0);
 }
 }
 
 
+static struct dev_pm_ops pcspkr_pm_ops = {
+	.suspend = pcspkr_suspend,
+};
+
 static struct platform_driver pcspkr_platform_driver = {
 static struct platform_driver pcspkr_platform_driver = {
 	.driver		= {
 	.driver		= {
 		.name	= "pcspkr",
 		.name	= "pcspkr",
 		.owner	= THIS_MODULE,
 		.owner	= THIS_MODULE,
+		.pm	= &pcspkr_pm_ops,
 	},
 	},
 	.probe		= pcspkr_probe,
 	.probe		= pcspkr_probe,
 	.remove		= __devexit_p(pcspkr_remove),
 	.remove		= __devexit_p(pcspkr_remove),
-	.suspend	= pcspkr_suspend,
 	.shutdown	= pcspkr_shutdown,
 	.shutdown	= pcspkr_shutdown,
 };
 };
 
 

+ 9 - 0
drivers/input/misc/wistron_btns.c

@@ -644,6 +644,15 @@ static struct dmi_system_id dmi_ids[] __initdata = {
 		},
 		},
 		.driver_data = keymap_fs_amilo_pro_v2000
 		.driver_data = keymap_fs_amilo_pro_v2000
 	},
 	},
+	{
+		.callback = dmi_matched,
+		.ident = "Maxdata Pro 7000 DX",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "MAXDATA"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Pro 7000"),
+		},
+		.driver_data = keymap_fs_amilo_pro_v2000
+	},
 	{
 	{
 		.callback = dmi_matched,
 		.callback = dmi_matched,
 		.ident = "Fujitsu N3510",
 		.ident = "Fujitsu N3510",

+ 2 - 2
drivers/isdn/mISDN/l1oip_core.c

@@ -731,10 +731,10 @@ l1oip_socket_thread(void *data)
 	while (!signal_pending(current)) {
 	while (!signal_pending(current)) {
 		struct kvec iov = {
 		struct kvec iov = {
 			.iov_base = recvbuf,
 			.iov_base = recvbuf,
-			.iov_len = sizeof(recvbuf),
+			.iov_len = recvbuf_size,
 		};
 		};
 		recvlen = kernel_recvmsg(socket, &msg, &iov, 1,
 		recvlen = kernel_recvmsg(socket, &msg, &iov, 1,
-					 sizeof(recvbuf), 0);
+					 recvbuf_size, 0);
 		if (recvlen > 0) {
 		if (recvlen > 0) {
 			l1oip_socket_parse(hc, &sin_rx, recvbuf, recvlen);
 			l1oip_socket_parse(hc, &sin_rx, recvbuf, recvlen);
 		} else {
 		} else {

+ 1 - 1
drivers/md/dm-crypt.c

@@ -1318,7 +1318,7 @@ static int crypt_iterate_devices(struct dm_target *ti,
 {
 {
 	struct crypt_config *cc = ti->private;
 	struct crypt_config *cc = ti->private;
 
 
-	return fn(ti, cc->dev, cc->start, data);
+	return fn(ti, cc->dev, cc->start, ti->len, data);
 }
 }
 
 
 static struct target_type crypt_target = {
 static struct target_type crypt_target = {

+ 2 - 2
drivers/md/dm-delay.c

@@ -324,12 +324,12 @@ static int delay_iterate_devices(struct dm_target *ti,
 	struct delay_c *dc = ti->private;
 	struct delay_c *dc = ti->private;
 	int ret = 0;
 	int ret = 0;
 
 
-	ret = fn(ti, dc->dev_read, dc->start_read, data);
+	ret = fn(ti, dc->dev_read, dc->start_read, ti->len, data);
 	if (ret)
 	if (ret)
 		goto out;
 		goto out;
 
 
 	if (dc->dev_write)
 	if (dc->dev_write)
-		ret = fn(ti, dc->dev_write, dc->start_write, data);
+		ret = fn(ti, dc->dev_write, dc->start_write, ti->len, data);
 
 
 out:
 out:
 	return ret;
 	return ret;

+ 1 - 1
drivers/md/dm-linear.c

@@ -139,7 +139,7 @@ static int linear_iterate_devices(struct dm_target *ti,
 {
 {
 	struct linear_c *lc = ti->private;
 	struct linear_c *lc = ti->private;
 
 
-	return fn(ti, lc->dev, lc->start, data);
+	return fn(ti, lc->dev, lc->start, ti->len, data);
 }
 }
 
 
 static struct target_type linear_target = {
 static struct target_type linear_target = {

+ 1 - 1
drivers/md/dm-mpath.c

@@ -1453,7 +1453,7 @@ static int multipath_iterate_devices(struct dm_target *ti,
 
 
 	list_for_each_entry(pg, &m->priority_groups, list) {
 	list_for_each_entry(pg, &m->priority_groups, list) {
 		list_for_each_entry(p, &pg->pgpaths, list) {
 		list_for_each_entry(p, &pg->pgpaths, list) {
-			ret = fn(ti, p->path.dev, ti->begin, data);
+			ret = fn(ti, p->path.dev, ti->begin, ti->len, data);
 			if (ret)
 			if (ret)
 				goto out;
 				goto out;
 		}
 		}

+ 2 - 1
drivers/md/dm-raid1.c

@@ -638,6 +638,7 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes)
 		spin_lock_irq(&ms->lock);
 		spin_lock_irq(&ms->lock);
 		bio_list_merge(&ms->writes, &requeue);
 		bio_list_merge(&ms->writes, &requeue);
 		spin_unlock_irq(&ms->lock);
 		spin_unlock_irq(&ms->lock);
+		delayed_wake(ms);
 	}
 	}
 
 
 	/*
 	/*
@@ -1292,7 +1293,7 @@ static int mirror_iterate_devices(struct dm_target *ti,
 
 
 	for (i = 0; !ret && i < ms->nr_mirrors; i++)
 	for (i = 0; !ret && i < ms->nr_mirrors; i++)
 		ret = fn(ti, ms->mirror[i].dev,
 		ret = fn(ti, ms->mirror[i].dev,
-			 ms->mirror[i].offset, data);
+			 ms->mirror[i].offset, ti->len, data);
 
 
 	return ret;
 	return ret;
 }
 }

部分文件因为文件数量过多而无法显示