diff options
Diffstat (limited to 'arch')
52 files changed, 718 insertions, 197 deletions
diff --git a/arch/arm/mach-pxa/include/mach/pxafb.h b/arch/arm/mach-pxa/include/mach/pxafb.h index 8e591118371e..cbda4d35c421 100644 --- a/arch/arm/mach-pxa/include/mach/pxafb.h +++ b/arch/arm/mach-pxa/include/mach/pxafb.h | |||
@@ -33,6 +33,7 @@ | |||
33 | #define LCD_CONN_TYPE(_x) ((_x) & 0x0f) | 33 | #define LCD_CONN_TYPE(_x) ((_x) & 0x0f) |
34 | #define LCD_CONN_WIDTH(_x) (((_x) >> 4) & 0x1f) | 34 | #define LCD_CONN_WIDTH(_x) (((_x) >> 4) & 0x1f) |
35 | 35 | ||
36 | #define LCD_TYPE_MASK 0xf | ||
36 | #define LCD_TYPE_UNKNOWN 0 | 37 | #define LCD_TYPE_UNKNOWN 0 |
37 | #define LCD_TYPE_MONO_STN 1 | 38 | #define LCD_TYPE_MONO_STN 1 |
38 | #define LCD_TYPE_MONO_DSTN 2 | 39 | #define LCD_TYPE_MONO_DSTN 2 |
diff --git a/arch/arm/mach-pxa/reset.c b/arch/arm/mach-pxa/reset.c index 1b2af575c40f..00b2dc2a1074 100644 --- a/arch/arm/mach-pxa/reset.c +++ b/arch/arm/mach-pxa/reset.c | |||
@@ -90,12 +90,13 @@ void arch_reset(char mode) | |||
90 | /* Jump into ROM at address 0 */ | 90 | /* Jump into ROM at address 0 */ |
91 | cpu_reset(0); | 91 | cpu_reset(0); |
92 | break; | 92 | break; |
93 | case 'h': | ||
94 | do_hw_reset(); | ||
95 | break; | ||
96 | case 'g': | 93 | case 'g': |
97 | do_gpio_reset(); | 94 | do_gpio_reset(); |
98 | break; | 95 | break; |
96 | case 'h': | ||
97 | default: | ||
98 | do_hw_reset(); | ||
99 | break; | ||
99 | } | 100 | } |
100 | } | 101 | } |
101 | 102 | ||
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index f0a5bbae0b45..3be76ee2bdbf 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
@@ -67,6 +67,7 @@ | |||
67 | static unsigned long spitz_pin_config[] __initdata = { | 67 | static unsigned long spitz_pin_config[] __initdata = { |
68 | /* Chip Selects */ | 68 | /* Chip Selects */ |
69 | GPIO78_nCS_2, /* SCOOP #2 */ | 69 | GPIO78_nCS_2, /* SCOOP #2 */ |
70 | GPIO79_nCS_3, /* NAND */ | ||
70 | GPIO80_nCS_4, /* SCOOP #1 */ | 71 | GPIO80_nCS_4, /* SCOOP #1 */ |
71 | 72 | ||
72 | /* LCD - 16bpp Active TFT */ | 73 | /* LCD - 16bpp Active TFT */ |
@@ -97,10 +98,10 @@ static unsigned long spitz_pin_config[] __initdata = { | |||
97 | GPIO51_nPIOW, | 98 | GPIO51_nPIOW, |
98 | GPIO85_nPCE_1, | 99 | GPIO85_nPCE_1, |
99 | GPIO54_nPCE_2, | 100 | GPIO54_nPCE_2, |
100 | GPIO79_PSKTSEL, | ||
101 | GPIO55_nPREG, | 101 | GPIO55_nPREG, |
102 | GPIO56_nPWAIT, | 102 | GPIO56_nPWAIT, |
103 | GPIO57_nIOIS16, | 103 | GPIO57_nIOIS16, |
104 | GPIO104_PSKTSEL, | ||
104 | 105 | ||
105 | /* MMC */ | 106 | /* MMC */ |
106 | GPIO32_MMC_CLK, | 107 | GPIO32_MMC_CLK, |
@@ -686,7 +687,6 @@ static void __init akita_init(void) | |||
686 | spitz_pcmcia_config.num_devs = 1; | 687 | spitz_pcmcia_config.num_devs = 1; |
687 | platform_scoop_config = &spitz_pcmcia_config; | 688 | platform_scoop_config = &spitz_pcmcia_config; |
688 | 689 | ||
689 | pxa_set_i2c_info(NULL); | ||
690 | i2c_register_board_info(0, ARRAY_AND_SIZE(akita_i2c_board_info)); | 690 | i2c_register_board_info(0, ARRAY_AND_SIZE(akita_i2c_board_info)); |
691 | 691 | ||
692 | common_init(); | 692 | common_init(); |
diff --git a/arch/ia64/include/asm/intrinsics.h b/arch/ia64/include/asm/intrinsics.h index 47d686dba1eb..a3e44a5ed497 100644 --- a/arch/ia64/include/asm/intrinsics.h +++ b/arch/ia64/include/asm/intrinsics.h | |||
@@ -226,7 +226,7 @@ extern long ia64_cmpxchg_called_with_bad_pointer (void); | |||
226 | /************************************************/ | 226 | /************************************************/ |
227 | #define ia64_ssm IA64_INTRINSIC_MACRO(ssm) | 227 | #define ia64_ssm IA64_INTRINSIC_MACRO(ssm) |
228 | #define ia64_rsm IA64_INTRINSIC_MACRO(rsm) | 228 | #define ia64_rsm IA64_INTRINSIC_MACRO(rsm) |
229 | #define ia64_getreg IA64_INTRINSIC_API(getreg) | 229 | #define ia64_getreg IA64_INTRINSIC_MACRO(getreg) |
230 | #define ia64_setreg IA64_INTRINSIC_API(setreg) | 230 | #define ia64_setreg IA64_INTRINSIC_API(setreg) |
231 | #define ia64_set_rr IA64_INTRINSIC_API(set_rr) | 231 | #define ia64_set_rr IA64_INTRINSIC_API(set_rr) |
232 | #define ia64_get_rr IA64_INTRINSIC_API(get_rr) | 232 | #define ia64_get_rr IA64_INTRINSIC_API(get_rr) |
diff --git a/arch/ia64/include/asm/paravirt_privop.h b/arch/ia64/include/asm/paravirt_privop.h index d577aac11835..0b597424fcfc 100644 --- a/arch/ia64/include/asm/paravirt_privop.h +++ b/arch/ia64/include/asm/paravirt_privop.h | |||
@@ -78,6 +78,19 @@ extern unsigned long ia64_native_getreg_func(int regnum); | |||
78 | ia64_native_rsm(mask); \ | 78 | ia64_native_rsm(mask); \ |
79 | } while (0) | 79 | } while (0) |
80 | 80 | ||
81 | /* returned ip value should be the one in the caller, | ||
82 | * not in __paravirt_getreg() */ | ||
83 | #define paravirt_getreg(reg) \ | ||
84 | ({ \ | ||
85 | unsigned long res; \ | ||
86 | BUILD_BUG_ON(!__builtin_constant_p(reg)); \ | ||
87 | if ((reg) == _IA64_REG_IP) \ | ||
88 | res = ia64_native_getreg(_IA64_REG_IP); \ | ||
89 | else \ | ||
90 | res = pv_cpu_ops.getreg(reg); \ | ||
91 | res; \ | ||
92 | }) | ||
93 | |||
81 | /****************************************************************************** | 94 | /****************************************************************************** |
82 | * replacement of hand written assembly codes. | 95 | * replacement of hand written assembly codes. |
83 | */ | 96 | */ |
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 7ef0c594f5ed..d435f4a7a96c 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
@@ -499,6 +499,7 @@ GLOBAL_ENTRY(prefetch_stack) | |||
499 | END(prefetch_stack) | 499 | END(prefetch_stack) |
500 | 500 | ||
501 | GLOBAL_ENTRY(kernel_execve) | 501 | GLOBAL_ENTRY(kernel_execve) |
502 | rum psr.ac | ||
502 | mov r15=__NR_execve // put syscall number in place | 503 | mov r15=__NR_execve // put syscall number in place |
503 | break __BREAK_SYSCALL | 504 | break __BREAK_SYSCALL |
504 | br.ret.sptk.many rp | 505 | br.ret.sptk.many rp |
diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S index 66e491d8baac..59301c472800 100644 --- a/arch/ia64/kernel/head.S +++ b/arch/ia64/kernel/head.S | |||
@@ -260,7 +260,7 @@ start_ap: | |||
260 | * Switch into virtual mode: | 260 | * Switch into virtual mode: |
261 | */ | 261 | */ |
262 | movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \ | 262 | movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \ |
263 | |IA64_PSR_DI) | 263 | |IA64_PSR_DI|IA64_PSR_AC) |
264 | ;; | 264 | ;; |
265 | mov cr.ipsr=r16 | 265 | mov cr.ipsr=r16 |
266 | movl r17=1f | 266 | movl r17=1f |
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index 7dd96c127177..bab1de2d2f6a 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
@@ -1139,7 +1139,7 @@ ia64_mca_modify_original_stack(struct pt_regs *regs, | |||
1139 | return previous_current; | 1139 | return previous_current; |
1140 | 1140 | ||
1141 | no_mod: | 1141 | no_mod: |
1142 | printk(KERN_INFO "cpu %d, %s %s, original stack not modified\n", | 1142 | mprintk(KERN_INFO "cpu %d, %s %s, original stack not modified\n", |
1143 | smp_processor_id(), type, msg); | 1143 | smp_processor_id(), type, msg); |
1144 | return previous_current; | 1144 | return previous_current; |
1145 | } | 1145 | } |
diff --git a/arch/ia64/kernel/paravirt.c b/arch/ia64/kernel/paravirt.c index de35d8e8b7d2..9f14c16f6369 100644 --- a/arch/ia64/kernel/paravirt.c +++ b/arch/ia64/kernel/paravirt.c | |||
@@ -130,7 +130,7 @@ ia64_native_getreg_func(int regnum) | |||
130 | unsigned long res = -1; | 130 | unsigned long res = -1; |
131 | switch (regnum) { | 131 | switch (regnum) { |
132 | CASE_GET_REG(GP); | 132 | CASE_GET_REG(GP); |
133 | CASE_GET_REG(IP); | 133 | /*CASE_GET_REG(IP);*/ /* returned ip value shouldn't be constant */ |
134 | CASE_GET_REG(PSR); | 134 | CASE_GET_REG(PSR); |
135 | CASE_GET_REG(TP); | 135 | CASE_GET_REG(TP); |
136 | CASE_GET_REG(SP); | 136 | CASE_GET_REG(SP); |
diff --git a/arch/ia64/kernel/pci-dma.c b/arch/ia64/kernel/pci-dma.c index dbdb778efa05..2a92f637431d 100644 --- a/arch/ia64/kernel/pci-dma.c +++ b/arch/ia64/kernel/pci-dma.c | |||
@@ -19,7 +19,6 @@ | |||
19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
20 | 20 | ||
21 | #include <asm/page.h> | 21 | #include <asm/page.h> |
22 | #include <asm/iommu.h> | ||
23 | 22 | ||
24 | dma_addr_t bad_dma_address __read_mostly; | 23 | dma_addr_t bad_dma_address __read_mostly; |
25 | EXPORT_SYMBOL(bad_dma_address); | 24 | EXPORT_SYMBOL(bad_dma_address); |
diff --git a/arch/ia64/xen/hypercall.S b/arch/ia64/xen/hypercall.S index d4ff0b9e79f1..45e02bb64a92 100644 --- a/arch/ia64/xen/hypercall.S +++ b/arch/ia64/xen/hypercall.S | |||
@@ -58,7 +58,7 @@ __HCALL2(xen_set_rr, HYPERPRIVOP_SET_RR) | |||
58 | __HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR) | 58 | __HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR) |
59 | 59 | ||
60 | #ifdef CONFIG_IA32_SUPPORT | 60 | #ifdef CONFIG_IA32_SUPPORT |
61 | __HCALL1(xen_get_eflag, HYPERPRIVOP_GET_EFLAG) | 61 | __HCALL0(xen_get_eflag, HYPERPRIVOP_GET_EFLAG) |
62 | __HCALL1(xen_set_eflag, HYPERPRIVOP_SET_EFLAG) // refer SDM vol1 3.1.8 | 62 | __HCALL1(xen_set_eflag, HYPERPRIVOP_SET_EFLAG) // refer SDM vol1 3.1.8 |
63 | #endif /* CONFIG_IA32_SUPPORT */ | 63 | #endif /* CONFIG_IA32_SUPPORT */ |
64 | 64 | ||
diff --git a/arch/mips/include/asm/mach-rc32434/gpio.h b/arch/mips/include/asm/mach-rc32434/gpio.h index c8e554eafce3..b5cf6457305a 100644 --- a/arch/mips/include/asm/mach-rc32434/gpio.h +++ b/arch/mips/include/asm/mach-rc32434/gpio.h | |||
@@ -84,5 +84,7 @@ extern void set_434_reg(unsigned reg_offs, unsigned bit, unsigned len, unsigned | |||
84 | extern unsigned get_434_reg(unsigned reg_offs); | 84 | extern unsigned get_434_reg(unsigned reg_offs); |
85 | extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask); | 85 | extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask); |
86 | extern unsigned char get_latch_u5(void); | 86 | extern unsigned char get_latch_u5(void); |
87 | extern void rb532_gpio_set_ilevel(int bit, unsigned gpio); | ||
88 | extern void rb532_gpio_set_istat(int bit, unsigned gpio); | ||
87 | 89 | ||
88 | #endif /* _RC32434_GPIO_H_ */ | 90 | #endif /* _RC32434_GPIO_H_ */ |
diff --git a/arch/mips/include/asm/mach-rc32434/rb.h b/arch/mips/include/asm/mach-rc32434/rb.h index 79e8ef67d0d3..f25a84916703 100644 --- a/arch/mips/include/asm/mach-rc32434/rb.h +++ b/arch/mips/include/asm/mach-rc32434/rb.h | |||
@@ -40,12 +40,14 @@ | |||
40 | #define BTCS 0x010040 | 40 | #define BTCS 0x010040 |
41 | #define BTCOMPARE 0x010044 | 41 | #define BTCOMPARE 0x010044 |
42 | #define GPIOBASE 0x050000 | 42 | #define GPIOBASE 0x050000 |
43 | #define GPIOCFG 0x050004 | 43 | /* Offsets relative to GPIOBASE */ |
44 | #define GPIOD 0x050008 | 44 | #define GPIOFUNC 0x00 |
45 | #define GPIOILEVEL 0x05000C | 45 | #define GPIOCFG 0x04 |
46 | #define GPIOISTAT 0x050010 | 46 | #define GPIOD 0x08 |
47 | #define GPIONMIEN 0x050014 | 47 | #define GPIOILEVEL 0x0C |
48 | #define IMASK6 0x038038 | 48 | #define GPIOISTAT 0x10 |
49 | #define GPIONMIEN 0x14 | ||
50 | #define IMASK6 0x38 | ||
49 | #define LO_WPX (1 << 0) | 51 | #define LO_WPX (1 << 0) |
50 | #define LO_ALE (1 << 1) | 52 | #define LO_ALE (1 << 1) |
51 | #define LO_CLE (1 << 2) | 53 | #define LO_CLE (1 << 2) |
diff --git a/arch/mips/include/asm/time.h b/arch/mips/include/asm/time.h index d3bd5c5aa2ec..9601ea950542 100644 --- a/arch/mips/include/asm/time.h +++ b/arch/mips/include/asm/time.h | |||
@@ -63,7 +63,7 @@ static inline int mips_clockevent_init(void) | |||
63 | /* | 63 | /* |
64 | * Initialize the count register as a clocksource | 64 | * Initialize the count register as a clocksource |
65 | */ | 65 | */ |
66 | #ifdef CONFIG_CEVT_R4K | 66 | #ifdef CONFIG_CSRC_R4K |
67 | extern int init_mips_clocksource(void); | 67 | extern int init_mips_clocksource(void); |
68 | #else | 68 | #else |
69 | static inline int init_mips_clocksource(void) | 69 | static inline int init_mips_clocksource(void) |
diff --git a/arch/mips/kernel/csrc-r4k.c b/arch/mips/kernel/csrc-r4k.c index 86e026f067bc..74fb74583b4e 100644 --- a/arch/mips/kernel/csrc-r4k.c +++ b/arch/mips/kernel/csrc-r4k.c | |||
@@ -27,7 +27,7 @@ int __init init_mips_clocksource(void) | |||
27 | if (!cpu_has_counter || !mips_hpt_frequency) | 27 | if (!cpu_has_counter || !mips_hpt_frequency) |
28 | return -ENXIO; | 28 | return -ENXIO; |
29 | 29 | ||
30 | /* Calclate a somewhat reasonable rating value */ | 30 | /* Calculate a somewhat reasonable rating value */ |
31 | clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000; | 31 | clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000; |
32 | 32 | ||
33 | clocksource_set_clock(&clocksource_mips, mips_hpt_frequency); | 33 | clocksource_set_clock(&clocksource_mips, mips_hpt_frequency); |
diff --git a/arch/mips/mm/sc-ip22.c b/arch/mips/mm/sc-ip22.c index 1f602a110e10..13adb5782110 100644 --- a/arch/mips/mm/sc-ip22.c +++ b/arch/mips/mm/sc-ip22.c | |||
@@ -161,7 +161,7 @@ static inline int __init indy_sc_probe(void) | |||
161 | 161 | ||
162 | /* XXX Check with wje if the Indy caches can differenciate between | 162 | /* XXX Check with wje if the Indy caches can differenciate between |
163 | writeback + invalidate and just invalidate. */ | 163 | writeback + invalidate and just invalidate. */ |
164 | struct bcache_ops indy_sc_ops = { | 164 | static struct bcache_ops indy_sc_ops = { |
165 | .bc_enable = indy_sc_enable, | 165 | .bc_enable = indy_sc_enable, |
166 | .bc_disable = indy_sc_disable, | 166 | .bc_disable = indy_sc_disable, |
167 | .bc_wback_inv = indy_sc_wback_invalidate, | 167 | .bc_wback_inv = indy_sc_wback_invalidate, |
diff --git a/arch/mips/mti-malta/malta-amon.c b/arch/mips/mti-malta/malta-amon.c index 96236bf33838..df9e526312a2 100644 --- a/arch/mips/mti-malta/malta-amon.c +++ b/arch/mips/mti-malta/malta-amon.c | |||
@@ -22,9 +22,9 @@ | |||
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/smp.h> | 23 | #include <linux/smp.h> |
24 | 24 | ||
25 | #include <asm-mips/addrspace.h> | 25 | #include <asm/addrspace.h> |
26 | #include <asm-mips/mips-boards/launch.h> | 26 | #include <asm/mips-boards/launch.h> |
27 | #include <asm-mips/mipsmtregs.h> | 27 | #include <asm/mipsmtregs.h> |
28 | 28 | ||
29 | int amon_cpu_avail(int cpu) | 29 | int amon_cpu_avail(int cpu) |
30 | { | 30 | { |
diff --git a/arch/mips/rb532/devices.c b/arch/mips/rb532/devices.c index 2f22d714d5b0..c1c29181bd46 100644 --- a/arch/mips/rb532/devices.c +++ b/arch/mips/rb532/devices.c | |||
@@ -118,7 +118,7 @@ static struct platform_device cf_slot0 = { | |||
118 | /* Resources and device for NAND */ | 118 | /* Resources and device for NAND */ |
119 | static int rb532_dev_ready(struct mtd_info *mtd) | 119 | static int rb532_dev_ready(struct mtd_info *mtd) |
120 | { | 120 | { |
121 | return readl(IDT434_REG_BASE + GPIOD) & GPIO_RDY; | 121 | return gpio_get_value(GPIO_RDY); |
122 | } | 122 | } |
123 | 123 | ||
124 | static void rb532_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) | 124 | static void rb532_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) |
diff --git a/arch/mips/rb532/gpio.c b/arch/mips/rb532/gpio.c index 70c4a6726377..0e84c8ab6a39 100644 --- a/arch/mips/rb532/gpio.c +++ b/arch/mips/rb532/gpio.c | |||
@@ -39,10 +39,6 @@ | |||
39 | struct rb532_gpio_chip { | 39 | struct rb532_gpio_chip { |
40 | struct gpio_chip chip; | 40 | struct gpio_chip chip; |
41 | void __iomem *regbase; | 41 | void __iomem *regbase; |
42 | void (*set_int_level)(struct gpio_chip *chip, unsigned offset, int value); | ||
43 | int (*get_int_level)(struct gpio_chip *chip, unsigned offset); | ||
44 | void (*set_int_status)(struct gpio_chip *chip, unsigned offset, int value); | ||
45 | int (*get_int_status)(struct gpio_chip *chip, unsigned offset); | ||
46 | }; | 42 | }; |
47 | 43 | ||
48 | struct mpmc_device dev3; | 44 | struct mpmc_device dev3; |
@@ -111,15 +107,47 @@ unsigned char get_latch_u5(void) | |||
111 | } | 107 | } |
112 | EXPORT_SYMBOL(get_latch_u5); | 108 | EXPORT_SYMBOL(get_latch_u5); |
113 | 109 | ||
110 | /* rb532_set_bit - sanely set a bit | ||
111 | * | ||
112 | * bitval: new value for the bit | ||
113 | * offset: bit index in the 4 byte address range | ||
114 | * ioaddr: 4 byte aligned address being altered | ||
115 | */ | ||
116 | static inline void rb532_set_bit(unsigned bitval, | ||
117 | unsigned offset, void __iomem *ioaddr) | ||
118 | { | ||
119 | unsigned long flags; | ||
120 | u32 val; | ||
121 | |||
122 | bitval = !!bitval; /* map parameter to {0,1} */ | ||
123 | |||
124 | local_irq_save(flags); | ||
125 | |||
126 | val = readl(ioaddr); | ||
127 | val &= ~( ~bitval << offset ); /* unset bit if bitval == 0 */ | ||
128 | val |= ( bitval << offset ); /* set bit if bitval == 1 */ | ||
129 | writel(val, ioaddr); | ||
130 | |||
131 | local_irq_restore(flags); | ||
132 | } | ||
133 | |||
134 | /* rb532_get_bit - read a bit | ||
135 | * | ||
136 | * returns the boolean state of the bit, which may be > 1 | ||
137 | */ | ||
138 | static inline int rb532_get_bit(unsigned offset, void __iomem *ioaddr) | ||
139 | { | ||
140 | return (readl(ioaddr) & (1 << offset)); | ||
141 | } | ||
142 | |||
114 | /* | 143 | /* |
115 | * Return GPIO level */ | 144 | * Return GPIO level */ |
116 | static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) | 145 | static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) |
117 | { | 146 | { |
118 | u32 mask = 1 << offset; | ||
119 | struct rb532_gpio_chip *gpch; | 147 | struct rb532_gpio_chip *gpch; |
120 | 148 | ||
121 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 149 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
122 | return readl(gpch->regbase + GPIOD) & mask; | 150 | return rb532_get_bit(offset, gpch->regbase + GPIOD); |
123 | } | 151 | } |
124 | 152 | ||
125 | /* | 153 | /* |
@@ -128,23 +156,10 @@ static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) | |||
128 | static void rb532_gpio_set(struct gpio_chip *chip, | 156 | static void rb532_gpio_set(struct gpio_chip *chip, |
129 | unsigned offset, int value) | 157 | unsigned offset, int value) |
130 | { | 158 | { |
131 | unsigned long flags; | ||
132 | u32 mask = 1 << offset; | ||
133 | u32 tmp; | ||
134 | struct rb532_gpio_chip *gpch; | 159 | struct rb532_gpio_chip *gpch; |
135 | void __iomem *gpvr; | ||
136 | 160 | ||
137 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 161 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
138 | gpvr = gpch->regbase + GPIOD; | 162 | rb532_set_bit(value, offset, gpch->regbase + GPIOD); |
139 | |||
140 | local_irq_save(flags); | ||
141 | tmp = readl(gpvr); | ||
142 | if (value) | ||
143 | tmp |= mask; | ||
144 | else | ||
145 | tmp &= ~mask; | ||
146 | writel(tmp, gpvr); | ||
147 | local_irq_restore(flags); | ||
148 | } | 163 | } |
149 | 164 | ||
150 | /* | 165 | /* |
@@ -152,21 +167,14 @@ static void rb532_gpio_set(struct gpio_chip *chip, | |||
152 | */ | 167 | */ |
153 | static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | 168 | static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) |
154 | { | 169 | { |
155 | unsigned long flags; | ||
156 | u32 mask = 1 << offset; | ||
157 | u32 value; | ||
158 | struct rb532_gpio_chip *gpch; | 170 | struct rb532_gpio_chip *gpch; |
159 | void __iomem *gpdr; | ||
160 | 171 | ||
161 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 172 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
162 | gpdr = gpch->regbase + GPIOCFG; | ||
163 | 173 | ||
164 | local_irq_save(flags); | 174 | if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC)) |
165 | value = readl(gpdr); | 175 | return 1; /* alternate function, GPIOCFG is ignored */ |
166 | value &= ~mask; | ||
167 | writel(value, gpdr); | ||
168 | local_irq_restore(flags); | ||
169 | 176 | ||
177 | rb532_set_bit(0, offset, gpch->regbase + GPIOCFG); | ||
170 | return 0; | 178 | return 0; |
171 | } | 179 | } |
172 | 180 | ||
@@ -176,117 +184,60 @@ static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | |||
176 | static int rb532_gpio_direction_output(struct gpio_chip *chip, | 184 | static int rb532_gpio_direction_output(struct gpio_chip *chip, |
177 | unsigned offset, int value) | 185 | unsigned offset, int value) |
178 | { | 186 | { |
179 | unsigned long flags; | ||
180 | u32 mask = 1 << offset; | ||
181 | u32 tmp; | ||
182 | struct rb532_gpio_chip *gpch; | 187 | struct rb532_gpio_chip *gpch; |
183 | void __iomem *gpdr; | ||
184 | 188 | ||
185 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 189 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
186 | writel(mask, gpch->regbase + GPIOD); | ||
187 | gpdr = gpch->regbase + GPIOCFG; | ||
188 | 190 | ||
189 | local_irq_save(flags); | 191 | if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC)) |
190 | tmp = readl(gpdr); | 192 | return 1; /* alternate function, GPIOCFG is ignored */ |
191 | tmp |= mask; | ||
192 | writel(tmp, gpdr); | ||
193 | local_irq_restore(flags); | ||
194 | 193 | ||
194 | /* set the initial output value */ | ||
195 | rb532_set_bit(value, offset, gpch->regbase + GPIOD); | ||
196 | |||
197 | rb532_set_bit(1, offset, gpch->regbase + GPIOCFG); | ||
195 | return 0; | 198 | return 0; |
196 | } | 199 | } |
197 | 200 | ||
198 | /* | 201 | static struct rb532_gpio_chip rb532_gpio_chip[] = { |
199 | * Set the GPIO interrupt level | 202 | [0] = { |
200 | */ | 203 | .chip = { |
201 | static void rb532_gpio_set_int_level(struct gpio_chip *chip, | 204 | .label = "gpio0", |
202 | unsigned offset, int value) | 205 | .direction_input = rb532_gpio_direction_input, |
203 | { | 206 | .direction_output = rb532_gpio_direction_output, |
204 | unsigned long flags; | 207 | .get = rb532_gpio_get, |
205 | u32 mask = 1 << offset; | 208 | .set = rb532_gpio_set, |
206 | u32 tmp; | 209 | .base = 0, |
207 | struct rb532_gpio_chip *gpch; | 210 | .ngpio = 32, |
208 | void __iomem *gpil; | 211 | }, |
209 | 212 | }, | |
210 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 213 | }; |
211 | gpil = gpch->regbase + GPIOILEVEL; | ||
212 | |||
213 | local_irq_save(flags); | ||
214 | tmp = readl(gpil); | ||
215 | if (value) | ||
216 | tmp |= mask; | ||
217 | else | ||
218 | tmp &= ~mask; | ||
219 | writel(tmp, gpil); | ||
220 | local_irq_restore(flags); | ||
221 | } | ||
222 | 214 | ||
223 | /* | 215 | /* |
224 | * Get the GPIO interrupt level | 216 | * Set GPIO interrupt level |
225 | */ | 217 | */ |
226 | static int rb532_gpio_get_int_level(struct gpio_chip *chip, unsigned offset) | 218 | void rb532_gpio_set_ilevel(int bit, unsigned gpio) |
227 | { | 219 | { |
228 | u32 mask = 1 << offset; | 220 | rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOILEVEL); |
229 | struct rb532_gpio_chip *gpch; | ||
230 | |||
231 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | ||
232 | return readl(gpch->regbase + GPIOILEVEL) & mask; | ||
233 | } | 221 | } |
222 | EXPORT_SYMBOL(rb532_gpio_set_ilevel); | ||
234 | 223 | ||
235 | /* | 224 | /* |
236 | * Set the GPIO interrupt status | 225 | * Set GPIO interrupt status |
237 | */ | 226 | */ |
238 | static void rb532_gpio_set_int_status(struct gpio_chip *chip, | 227 | void rb532_gpio_set_istat(int bit, unsigned gpio) |
239 | unsigned offset, int value) | ||
240 | { | 228 | { |
241 | unsigned long flags; | 229 | rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOISTAT); |
242 | u32 mask = 1 << offset; | ||
243 | u32 tmp; | ||
244 | struct rb532_gpio_chip *gpch; | ||
245 | void __iomem *gpis; | ||
246 | |||
247 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | ||
248 | gpis = gpch->regbase + GPIOISTAT; | ||
249 | |||
250 | local_irq_save(flags); | ||
251 | tmp = readl(gpis); | ||
252 | if (value) | ||
253 | tmp |= mask; | ||
254 | else | ||
255 | tmp &= ~mask; | ||
256 | writel(tmp, gpis); | ||
257 | local_irq_restore(flags); | ||
258 | } | 230 | } |
231 | EXPORT_SYMBOL(rb532_gpio_set_istat); | ||
259 | 232 | ||
260 | /* | 233 | /* |
261 | * Get the GPIO interrupt status | 234 | * Configure GPIO alternate function |
262 | */ | 235 | */ |
263 | static int rb532_gpio_get_int_status(struct gpio_chip *chip, unsigned offset) | 236 | static void rb532_gpio_set_func(int bit, unsigned gpio) |
264 | { | 237 | { |
265 | u32 mask = 1 << offset; | 238 | rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOFUNC); |
266 | struct rb532_gpio_chip *gpch; | ||
267 | |||
268 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | ||
269 | return readl(gpch->regbase + GPIOISTAT) & mask; | ||
270 | } | 239 | } |
271 | 240 | ||
272 | static struct rb532_gpio_chip rb532_gpio_chip[] = { | ||
273 | [0] = { | ||
274 | .chip = { | ||
275 | .label = "gpio0", | ||
276 | .direction_input = rb532_gpio_direction_input, | ||
277 | .direction_output = rb532_gpio_direction_output, | ||
278 | .get = rb532_gpio_get, | ||
279 | .set = rb532_gpio_set, | ||
280 | .base = 0, | ||
281 | .ngpio = 32, | ||
282 | }, | ||
283 | .get_int_level = rb532_gpio_get_int_level, | ||
284 | .set_int_level = rb532_gpio_set_int_level, | ||
285 | .get_int_status = rb532_gpio_get_int_status, | ||
286 | .set_int_status = rb532_gpio_set_int_status, | ||
287 | }, | ||
288 | }; | ||
289 | |||
290 | int __init rb532_gpio_init(void) | 241 | int __init rb532_gpio_init(void) |
291 | { | 242 | { |
292 | struct resource *r; | 243 | struct resource *r; |
@@ -310,9 +261,11 @@ int __init rb532_gpio_init(void) | |||
310 | return -ENXIO; | 261 | return -ENXIO; |
311 | } | 262 | } |
312 | 263 | ||
313 | /* Set the interrupt status and level for the CF pin */ | 264 | /* configure CF_GPIO_NUM as CFRDY IRQ source */ |
314 | rb532_gpio_set_int_level(&rb532_gpio_chip->chip, CF_GPIO_NUM, 1); | 265 | rb532_gpio_set_func(0, CF_GPIO_NUM); |
315 | rb532_gpio_set_int_status(&rb532_gpio_chip->chip, CF_GPIO_NUM, 0); | 266 | rb532_gpio_direction_input(&rb532_gpio_chip->chip, CF_GPIO_NUM); |
267 | rb532_gpio_set_ilevel(1, CF_GPIO_NUM); | ||
268 | rb532_gpio_set_istat(0, CF_GPIO_NUM); | ||
316 | 269 | ||
317 | return 0; | 270 | return 0; |
318 | } | 271 | } |
diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 90904f9dfc50..927db3668b6f 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c | |||
@@ -183,10 +183,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
183 | * being 64 bit in both cases. | 183 | * being 64 bit in both cases. |
184 | */ | 184 | */ |
185 | 185 | ||
186 | static long translate_usr_offset(long offset) | 186 | static compat_ulong_t translate_usr_offset(compat_ulong_t offset) |
187 | { | 187 | { |
188 | if (offset < 0) | 188 | if (offset < 0) |
189 | return -1; | 189 | return sizeof(struct pt_regs); |
190 | else if (offset <= 32*4) /* gr[0..31] */ | 190 | else if (offset <= 32*4) /* gr[0..31] */ |
191 | return offset * 2 + 4; | 191 | return offset * 2 + 4; |
192 | else if (offset <= 32*4+32*8) /* gr[0..31] + fr[0..31] */ | 192 | else if (offset <= 32*4+32*8) /* gr[0..31] + fr[0..31] */ |
@@ -194,7 +194,7 @@ static long translate_usr_offset(long offset) | |||
194 | else if (offset < sizeof(struct pt_regs)/2 + 32*4) | 194 | else if (offset < sizeof(struct pt_regs)/2 + 32*4) |
195 | return offset * 2 + 4 - 32*8; | 195 | return offset * 2 + 4 - 32*8; |
196 | else | 196 | else |
197 | return -1; | 197 | return sizeof(struct pt_regs); |
198 | } | 198 | } |
199 | 199 | ||
200 | long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | 200 | long compat_arch_ptrace(struct task_struct *child, compat_long_t request, |
@@ -209,7 +209,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
209 | if (addr & (sizeof(compat_uint_t)-1)) | 209 | if (addr & (sizeof(compat_uint_t)-1)) |
210 | break; | 210 | break; |
211 | addr = translate_usr_offset(addr); | 211 | addr = translate_usr_offset(addr); |
212 | if (addr < 0) | 212 | if (addr >= sizeof(struct pt_regs)) |
213 | break; | 213 | break; |
214 | 214 | ||
215 | tmp = *(compat_uint_t *) ((char *) task_regs(child) + addr); | 215 | tmp = *(compat_uint_t *) ((char *) task_regs(child) + addr); |
@@ -236,7 +236,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
236 | if (addr & (sizeof(compat_uint_t)-1)) | 236 | if (addr & (sizeof(compat_uint_t)-1)) |
237 | break; | 237 | break; |
238 | addr = translate_usr_offset(addr); | 238 | addr = translate_usr_offset(addr); |
239 | if (addr < 0) | 239 | if (addr >= sizeof(struct pt_regs)) |
240 | break; | 240 | break; |
241 | if (addr >= PT_FR0 && addr <= PT_FR31 + 4) { | 241 | if (addr >= PT_FR0 && addr <= PT_FR31 + 4) { |
242 | /* Special case, fp regs are 64 bits anyway */ | 242 | /* Special case, fp regs are 64 bits anyway */ |
diff --git a/arch/sparc/include/asm/unistd_32.h b/arch/sparc/include/asm/unistd_32.h index 648643a9f139..0d13d2a4c76f 100644 --- a/arch/sparc/include/asm/unistd_32.h +++ b/arch/sparc/include/asm/unistd_32.h | |||
@@ -338,8 +338,9 @@ | |||
338 | #define __NR_dup3 320 | 338 | #define __NR_dup3 320 |
339 | #define __NR_pipe2 321 | 339 | #define __NR_pipe2 321 |
340 | #define __NR_inotify_init1 322 | 340 | #define __NR_inotify_init1 322 |
341 | #define __NR_accept4 323 | ||
341 | 342 | ||
342 | #define NR_SYSCALLS 323 | 343 | #define NR_SYSCALLS 324 |
343 | 344 | ||
344 | /* Sparc 32-bit only has the "setresuid32", "getresuid32" variants, | 345 | /* Sparc 32-bit only has the "setresuid32", "getresuid32" variants, |
345 | * it never had the plain ones and there is no value to adding those | 346 | * it never had the plain ones and there is no value to adding those |
diff --git a/arch/sparc/include/asm/unistd_64.h b/arch/sparc/include/asm/unistd_64.h index c5cc0e052321..fa5d3c0343c7 100644 --- a/arch/sparc/include/asm/unistd_64.h +++ b/arch/sparc/include/asm/unistd_64.h | |||
@@ -340,8 +340,9 @@ | |||
340 | #define __NR_dup3 320 | 340 | #define __NR_dup3 320 |
341 | #define __NR_pipe2 321 | 341 | #define __NR_pipe2 321 |
342 | #define __NR_inotify_init1 322 | 342 | #define __NR_inotify_init1 322 |
343 | #define __NR_accept4 323 | ||
343 | 344 | ||
344 | #define NR_SYSCALLS 323 | 345 | #define NR_SYSCALLS 324 |
345 | 346 | ||
346 | #ifdef __KERNEL__ | 347 | #ifdef __KERNEL__ |
347 | #define __ARCH_WANT_IPC_PARSE_VERSION | 348 | #define __ARCH_WANT_IPC_PARSE_VERSION |
diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S index e1b9233b90ab..7d0807586442 100644 --- a/arch/sparc/kernel/systbls.S +++ b/arch/sparc/kernel/systbls.S | |||
@@ -81,4 +81,4 @@ sys_call_table: | |||
81 | /*305*/ .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait | 81 | /*305*/ .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait |
82 | /*310*/ .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate | 82 | /*310*/ .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate |
83 | /*315*/ .long sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 83 | /*315*/ .long sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
84 | /*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1 | 84 | /*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 |
diff --git a/arch/sparc64/kernel/sys32.S b/arch/sparc64/kernel/sys32.S index ade18ba0c686..f061c4dda9ef 100644 --- a/arch/sparc64/kernel/sys32.S +++ b/arch/sparc64/kernel/sys32.S | |||
@@ -150,7 +150,7 @@ sys32_mmap2: | |||
150 | sys32_socketcall: /* %o0=call, %o1=args */ | 150 | sys32_socketcall: /* %o0=call, %o1=args */ |
151 | cmp %o0, 1 | 151 | cmp %o0, 1 |
152 | bl,pn %xcc, do_einval | 152 | bl,pn %xcc, do_einval |
153 | cmp %o0, 17 | 153 | cmp %o0, 18 |
154 | bg,pn %xcc, do_einval | 154 | bg,pn %xcc, do_einval |
155 | sub %o0, 1, %o0 | 155 | sub %o0, 1, %o0 |
156 | sllx %o0, 5, %o0 | 156 | sllx %o0, 5, %o0 |
@@ -319,6 +319,15 @@ do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) | |||
319 | nop | 319 | nop |
320 | nop | 320 | nop |
321 | nop | 321 | nop |
322 | do_sys_accept4: /* sys_accept4(int, struct sockaddr *, int *, int) */ | ||
323 | 63: ldswa [%o1 + 0x0] %asi, %o0 | ||
324 | sethi %hi(sys_accept4), %g1 | ||
325 | 64: lduwa [%o1 + 0x8] %asi, %o2 | ||
326 | 65: ldswa [%o1 + 0xc] %asi, %o3 | ||
327 | jmpl %g1 + %lo(sys_accept4), %g0 | ||
328 | 66: lduwa [%o1 + 0x4] %asi, %o1 | ||
329 | nop | ||
330 | nop | ||
322 | 331 | ||
323 | .section __ex_table,"a" | 332 | .section __ex_table,"a" |
324 | .align 4 | 333 | .align 4 |
@@ -353,4 +362,6 @@ do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) | |||
353 | .word 57b, __retl_efault, 58b, __retl_efault | 362 | .word 57b, __retl_efault, 58b, __retl_efault |
354 | .word 59b, __retl_efault, 60b, __retl_efault | 363 | .word 59b, __retl_efault, 60b, __retl_efault |
355 | .word 61b, __retl_efault, 62b, __retl_efault | 364 | .word 61b, __retl_efault, 62b, __retl_efault |
365 | .word 63b, __retl_efault, 64b, __retl_efault | ||
366 | .word 65b, __retl_efault, 66b, __retl_efault | ||
356 | .previous | 367 | .previous |
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index b2fa4c163638..9fc78cf354bd 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S | |||
@@ -82,7 +82,7 @@ sys_call_table32: | |||
82 | .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait | 82 | .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait |
83 | /*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate | 83 | /*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate |
84 | .word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 84 | .word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
85 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1 | 85 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 |
86 | 86 | ||
87 | #endif /* CONFIG_COMPAT */ | 87 | #endif /* CONFIG_COMPAT */ |
88 | 88 | ||
@@ -156,4 +156,4 @@ sys_call_table: | |||
156 | .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait | 156 | .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait |
157 | /*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate | 157 | /*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate |
158 | .word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 158 | .word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
159 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1 | 159 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 93224b569187..7a146baaa990 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -29,6 +29,8 @@ config X86 | |||
29 | select HAVE_FTRACE_MCOUNT_RECORD | 29 | select HAVE_FTRACE_MCOUNT_RECORD |
30 | select HAVE_DYNAMIC_FTRACE | 30 | select HAVE_DYNAMIC_FTRACE |
31 | select HAVE_FUNCTION_TRACER | 31 | select HAVE_FUNCTION_TRACER |
32 | select HAVE_FUNCTION_RET_TRACER if X86_32 | ||
33 | select HAVE_FUNCTION_TRACE_MCOUNT_TEST | ||
32 | select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64) | 34 | select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64) |
33 | select HAVE_ARCH_KGDB if !X86_VOYAGER | 35 | select HAVE_ARCH_KGDB if !X86_VOYAGER |
34 | select HAVE_ARCH_TRACEHOOK | 36 | select HAVE_ARCH_TRACEHOOK |
@@ -167,9 +169,12 @@ config GENERIC_PENDING_IRQ | |||
167 | config X86_SMP | 169 | config X86_SMP |
168 | bool | 170 | bool |
169 | depends on SMP && ((X86_32 && !X86_VOYAGER) || X86_64) | 171 | depends on SMP && ((X86_32 && !X86_VOYAGER) || X86_64) |
170 | select USE_GENERIC_SMP_HELPERS | ||
171 | default y | 172 | default y |
172 | 173 | ||
174 | config USE_GENERIC_SMP_HELPERS | ||
175 | def_bool y | ||
176 | depends on SMP | ||
177 | |||
173 | config X86_32_SMP | 178 | config X86_32_SMP |
174 | def_bool y | 179 | def_bool y |
175 | depends on X86_32 && SMP | 180 | depends on X86_32 && SMP |
@@ -957,7 +962,7 @@ config ARCH_PHYS_ADDR_T_64BIT | |||
957 | config NUMA | 962 | config NUMA |
958 | bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)" | 963 | bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)" |
959 | depends on SMP | 964 | depends on SMP |
960 | depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && BROKEN) | 965 | depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && EXPERIMENTAL) |
961 | default n if X86_PC | 966 | default n if X86_PC |
962 | default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP) | 967 | default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP) |
963 | help | 968 | help |
diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug index 2a3dfbd5e677..fa013f529b74 100644 --- a/arch/x86/Kconfig.debug +++ b/arch/x86/Kconfig.debug | |||
@@ -186,14 +186,10 @@ config IOMMU_LEAK | |||
186 | Add a simple leak tracer to the IOMMU code. This is useful when you | 186 | Add a simple leak tracer to the IOMMU code. This is useful when you |
187 | are debugging a buggy device driver that leaks IOMMU mappings. | 187 | are debugging a buggy device driver that leaks IOMMU mappings. |
188 | 188 | ||
189 | config MMIOTRACE_HOOKS | ||
190 | bool | ||
191 | |||
192 | config MMIOTRACE | 189 | config MMIOTRACE |
193 | bool "Memory mapped IO tracing" | 190 | bool "Memory mapped IO tracing" |
194 | depends on DEBUG_KERNEL && PCI | 191 | depends on DEBUG_KERNEL && PCI |
195 | select TRACING | 192 | select TRACING |
196 | select MMIOTRACE_HOOKS | ||
197 | help | 193 | help |
198 | Mmiotrace traces Memory Mapped I/O access and is meant for | 194 | Mmiotrace traces Memory Mapped I/O access and is meant for |
199 | debugging and reverse engineering. It is called from the ioremap | 195 | debugging and reverse engineering. It is called from the ioremap |
diff --git a/arch/x86/include/asm/ftrace.h b/arch/x86/include/asm/ftrace.h index 9e8bc29b8b17..2bb43b433e07 100644 --- a/arch/x86/include/asm/ftrace.h +++ b/arch/x86/include/asm/ftrace.h | |||
@@ -17,8 +17,41 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr) | |||
17 | */ | 17 | */ |
18 | return addr - 1; | 18 | return addr - 1; |
19 | } | 19 | } |
20 | #endif | ||
21 | 20 | ||
21 | #ifdef CONFIG_DYNAMIC_FTRACE | ||
22 | |||
23 | struct dyn_arch_ftrace { | ||
24 | /* No extra data needed for x86 */ | ||
25 | }; | ||
26 | |||
27 | #endif /* CONFIG_DYNAMIC_FTRACE */ | ||
28 | #endif /* __ASSEMBLY__ */ | ||
22 | #endif /* CONFIG_FUNCTION_TRACER */ | 29 | #endif /* CONFIG_FUNCTION_TRACER */ |
23 | 30 | ||
31 | #ifdef CONFIG_FUNCTION_RET_TRACER | ||
32 | #define FTRACE_RET_STACK_SIZE 20 | ||
33 | |||
34 | #ifndef __ASSEMBLY__ | ||
35 | |||
36 | /* | ||
37 | * Stack of return addresses for functions | ||
38 | * of a thread. | ||
39 | * Used in struct thread_info | ||
40 | */ | ||
41 | struct ftrace_ret_stack { | ||
42 | unsigned long ret; | ||
43 | unsigned long func; | ||
44 | unsigned long long calltime; | ||
45 | }; | ||
46 | |||
47 | /* | ||
48 | * Primary handler of a function return. | ||
49 | * It relays on ftrace_return_to_handler. | ||
50 | * Defined in entry32.S | ||
51 | */ | ||
52 | extern void return_to_handler(void); | ||
53 | |||
54 | #endif /* __ASSEMBLY__ */ | ||
55 | #endif /* CONFIG_FUNCTION_RET_TRACER */ | ||
56 | |||
24 | #endif /* _ASM_X86_FTRACE_H */ | 57 | #endif /* _ASM_X86_FTRACE_H */ |
diff --git a/arch/x86/include/asm/iomap.h b/arch/x86/include/asm/iomap.h new file mode 100644 index 000000000000..c1f06289b14b --- /dev/null +++ b/arch/x86/include/asm/iomap.h | |||
@@ -0,0 +1,30 @@ | |||
1 | /* | ||
2 | * Copyright © 2008 Ingo Molnar | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, but | ||
10 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
12 | * General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along | ||
15 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
16 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. | ||
17 | */ | ||
18 | |||
19 | #include <linux/fs.h> | ||
20 | #include <linux/mm.h> | ||
21 | #include <linux/uaccess.h> | ||
22 | #include <asm/cacheflush.h> | ||
23 | #include <asm/pgtable.h> | ||
24 | #include <asm/tlbflush.h> | ||
25 | |||
26 | void * | ||
27 | iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot); | ||
28 | |||
29 | void | ||
30 | iounmap_atomic(void *kvaddr, enum km_type type); | ||
diff --git a/arch/x86/include/asm/mmzone_32.h b/arch/x86/include/asm/mmzone_32.h index 485bdf059ffb..07f1af494ca5 100644 --- a/arch/x86/include/asm/mmzone_32.h +++ b/arch/x86/include/asm/mmzone_32.h | |||
@@ -34,10 +34,14 @@ static inline void get_memcfg_numa(void) | |||
34 | 34 | ||
35 | extern int early_pfn_to_nid(unsigned long pfn); | 35 | extern int early_pfn_to_nid(unsigned long pfn); |
36 | 36 | ||
37 | extern void resume_map_numa_kva(pgd_t *pgd); | ||
38 | |||
37 | #else /* !CONFIG_NUMA */ | 39 | #else /* !CONFIG_NUMA */ |
38 | 40 | ||
39 | #define get_memcfg_numa get_memcfg_numa_flat | 41 | #define get_memcfg_numa get_memcfg_numa_flat |
40 | 42 | ||
43 | static inline void resume_map_numa_kva(pgd_t *pgd) {} | ||
44 | |||
41 | #endif /* CONFIG_NUMA */ | 45 | #endif /* CONFIG_NUMA */ |
42 | 46 | ||
43 | #ifdef CONFIG_DISCONTIGMEM | 47 | #ifdef CONFIG_DISCONTIGMEM |
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index e44d379faad2..e90e81ef6ab9 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h | |||
@@ -20,6 +20,8 @@ | |||
20 | struct task_struct; | 20 | struct task_struct; |
21 | struct exec_domain; | 21 | struct exec_domain; |
22 | #include <asm/processor.h> | 22 | #include <asm/processor.h> |
23 | #include <asm/ftrace.h> | ||
24 | #include <asm/atomic.h> | ||
23 | 25 | ||
24 | struct thread_info { | 26 | struct thread_info { |
25 | struct task_struct *task; /* main task structure */ | 27 | struct task_struct *task; /* main task structure */ |
@@ -38,8 +40,36 @@ struct thread_info { | |||
38 | */ | 40 | */ |
39 | __u8 supervisor_stack[0]; | 41 | __u8 supervisor_stack[0]; |
40 | #endif | 42 | #endif |
43 | |||
44 | #ifdef CONFIG_FUNCTION_RET_TRACER | ||
45 | /* Index of current stored adress in ret_stack */ | ||
46 | int curr_ret_stack; | ||
47 | /* Stack of return addresses for return function tracing */ | ||
48 | struct ftrace_ret_stack ret_stack[FTRACE_RET_STACK_SIZE]; | ||
49 | /* | ||
50 | * Number of functions that haven't been traced | ||
51 | * because of depth overrun. | ||
52 | */ | ||
53 | atomic_t trace_overrun; | ||
54 | #endif | ||
41 | }; | 55 | }; |
42 | 56 | ||
57 | #ifdef CONFIG_FUNCTION_RET_TRACER | ||
58 | #define INIT_THREAD_INFO(tsk) \ | ||
59 | { \ | ||
60 | .task = &tsk, \ | ||
61 | .exec_domain = &default_exec_domain, \ | ||
62 | .flags = 0, \ | ||
63 | .cpu = 0, \ | ||
64 | .preempt_count = 1, \ | ||
65 | .addr_limit = KERNEL_DS, \ | ||
66 | .restart_block = { \ | ||
67 | .fn = do_no_restart_syscall, \ | ||
68 | }, \ | ||
69 | .curr_ret_stack = -1,\ | ||
70 | .trace_overrun = ATOMIC_INIT(0) \ | ||
71 | } | ||
72 | #else | ||
43 | #define INIT_THREAD_INFO(tsk) \ | 73 | #define INIT_THREAD_INFO(tsk) \ |
44 | { \ | 74 | { \ |
45 | .task = &tsk, \ | 75 | .task = &tsk, \ |
@@ -52,6 +82,7 @@ struct thread_info { | |||
52 | .fn = do_no_restart_syscall, \ | 82 | .fn = do_no_restart_syscall, \ |
53 | }, \ | 83 | }, \ |
54 | } | 84 | } |
85 | #endif | ||
55 | 86 | ||
56 | #define init_thread_info (init_thread_union.thread_info) | 87 | #define init_thread_info (init_thread_union.thread_info) |
57 | #define init_stack (init_thread_union.stack) | 88 | #define init_stack (init_thread_union.stack) |
diff --git a/arch/x86/include/asm/uaccess_64.h b/arch/x86/include/asm/uaccess_64.h index 664f15280f14..f8cfd00db450 100644 --- a/arch/x86/include/asm/uaccess_64.h +++ b/arch/x86/include/asm/uaccess_64.h | |||
@@ -46,7 +46,7 @@ int __copy_from_user(void *dst, const void __user *src, unsigned size) | |||
46 | return ret; | 46 | return ret; |
47 | case 10: | 47 | case 10: |
48 | __get_user_asm(*(u64 *)dst, (u64 __user *)src, | 48 | __get_user_asm(*(u64 *)dst, (u64 __user *)src, |
49 | ret, "q", "", "=r", 16); | 49 | ret, "q", "", "=r", 10); |
50 | if (unlikely(ret)) | 50 | if (unlikely(ret)) |
51 | return ret; | 51 | return ret; |
52 | __get_user_asm(*(u16 *)(8 + (char *)dst), | 52 | __get_user_asm(*(u16 *)(8 + (char *)dst), |
diff --git a/arch/x86/include/asm/unistd_64.h b/arch/x86/include/asm/unistd_64.h index 834b2c1d89fb..d2e415e6666f 100644 --- a/arch/x86/include/asm/unistd_64.h +++ b/arch/x86/include/asm/unistd_64.h | |||
@@ -639,8 +639,8 @@ __SYSCALL(__NR_fallocate, sys_fallocate) | |||
639 | __SYSCALL(__NR_timerfd_settime, sys_timerfd_settime) | 639 | __SYSCALL(__NR_timerfd_settime, sys_timerfd_settime) |
640 | #define __NR_timerfd_gettime 287 | 640 | #define __NR_timerfd_gettime 287 |
641 | __SYSCALL(__NR_timerfd_gettime, sys_timerfd_gettime) | 641 | __SYSCALL(__NR_timerfd_gettime, sys_timerfd_gettime) |
642 | #define __NR_paccept 288 | 642 | #define __NR_accept4 288 |
643 | __SYSCALL(__NR_paccept, sys_paccept) | 643 | __SYSCALL(__NR_accept4, sys_accept4) |
644 | #define __NR_signalfd4 289 | 644 | #define __NR_signalfd4 289 |
645 | __SYSCALL(__NR_signalfd4, sys_signalfd4) | 645 | __SYSCALL(__NR_signalfd4, sys_signalfd4) |
646 | #define __NR_eventfd2 290 | 646 | #define __NR_eventfd2 290 |
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index e489ff9cb3e2..1d8ed95da846 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
@@ -14,6 +14,11 @@ CFLAGS_REMOVE_paravirt-spinlocks.o = -pg | |||
14 | CFLAGS_REMOVE_ftrace.o = -pg | 14 | CFLAGS_REMOVE_ftrace.o = -pg |
15 | endif | 15 | endif |
16 | 16 | ||
17 | ifdef CONFIG_FUNCTION_RET_TRACER | ||
18 | # Don't trace __switch_to() but let it for function tracer | ||
19 | CFLAGS_REMOVE_process_32.o = -pg | ||
20 | endif | ||
21 | |||
17 | # | 22 | # |
18 | # vsyscalls (which work on the user stack) should have | 23 | # vsyscalls (which work on the user stack) should have |
19 | # no stack-protector checks: | 24 | # no stack-protector checks: |
@@ -65,6 +70,7 @@ obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o | |||
65 | obj-$(CONFIG_X86_IO_APIC) += io_apic.o | 70 | obj-$(CONFIG_X86_IO_APIC) += io_apic.o |
66 | obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups_32.o | 71 | obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups_32.o |
67 | obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o | 72 | obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o |
73 | obj-$(CONFIG_FUNCTION_RET_TRACER) += ftrace.o | ||
68 | obj-$(CONFIG_KEXEC) += machine_kexec_$(BITS).o | 74 | obj-$(CONFIG_KEXEC) += machine_kexec_$(BITS).o |
69 | obj-$(CONFIG_KEXEC) += relocate_kernel_$(BITS).o crash.o | 75 | obj-$(CONFIG_KEXEC) += relocate_kernel_$(BITS).o crash.o |
70 | obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o | 76 | obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o |
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 331b318304eb..e4899e0e8787 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
@@ -537,7 +537,7 @@ static void dma_ops_free_addresses(struct dma_ops_domain *dom, | |||
537 | address >>= PAGE_SHIFT; | 537 | address >>= PAGE_SHIFT; |
538 | iommu_area_free(dom->bitmap, address, pages); | 538 | iommu_area_free(dom->bitmap, address, pages); |
539 | 539 | ||
540 | if (address + pages >= dom->next_bit) | 540 | if (address >= dom->next_bit) |
541 | dom->need_flush = true; | 541 | dom->need_flush = true; |
542 | } | 542 | } |
543 | 543 | ||
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index 0cdcda35a05f..30ae2701b3df 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
@@ -121,7 +121,7 @@ u16 amd_iommu_last_bdf; /* largest PCI device id we have | |||
121 | LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings | 121 | LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings |
122 | we find in ACPI */ | 122 | we find in ACPI */ |
123 | unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */ | 123 | unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */ |
124 | int amd_iommu_isolate; /* if 1, device isolation is enabled */ | 124 | int amd_iommu_isolate = 1; /* if 1, device isolation is enabled */ |
125 | bool amd_iommu_unmap_flush; /* if true, flush on every unmap */ | 125 | bool amd_iommu_unmap_flush; /* if true, flush on every unmap */ |
126 | 126 | ||
127 | LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the | 127 | LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the |
@@ -1213,7 +1213,9 @@ static int __init parse_amd_iommu_options(char *str) | |||
1213 | for (; *str; ++str) { | 1213 | for (; *str; ++str) { |
1214 | if (strncmp(str, "isolate", 7) == 0) | 1214 | if (strncmp(str, "isolate", 7) == 0) |
1215 | amd_iommu_isolate = 1; | 1215 | amd_iommu_isolate = 1; |
1216 | if (strncmp(str, "fullflush", 11) == 0) | 1216 | if (strncmp(str, "share", 5) == 0) |
1217 | amd_iommu_isolate = 0; | ||
1218 | if (strncmp(str, "fullflush", 9) == 0) | ||
1217 | amd_iommu_unmap_flush = true; | 1219 | amd_iommu_unmap_flush = true; |
1218 | } | 1220 | } |
1219 | 1221 | ||
diff --git a/arch/x86/kernel/ds.c b/arch/x86/kernel/ds.c index 2b69994fd3a8..d1a121443bde 100644 --- a/arch/x86/kernel/ds.c +++ b/arch/x86/kernel/ds.c | |||
@@ -236,17 +236,33 @@ static inline struct ds_context *ds_alloc_context(struct task_struct *task) | |||
236 | struct ds_context *context = *p_context; | 236 | struct ds_context *context = *p_context; |
237 | 237 | ||
238 | if (!context) { | 238 | if (!context) { |
239 | spin_unlock(&ds_lock); | ||
240 | |||
239 | context = kzalloc(sizeof(*context), GFP_KERNEL); | 241 | context = kzalloc(sizeof(*context), GFP_KERNEL); |
240 | 242 | ||
241 | if (!context) | 243 | if (!context) { |
244 | spin_lock(&ds_lock); | ||
242 | return NULL; | 245 | return NULL; |
246 | } | ||
243 | 247 | ||
244 | context->ds = kzalloc(ds_cfg.sizeof_ds, GFP_KERNEL); | 248 | context->ds = kzalloc(ds_cfg.sizeof_ds, GFP_KERNEL); |
245 | if (!context->ds) { | 249 | if (!context->ds) { |
246 | kfree(context); | 250 | kfree(context); |
251 | spin_lock(&ds_lock); | ||
247 | return NULL; | 252 | return NULL; |
248 | } | 253 | } |
249 | 254 | ||
255 | spin_lock(&ds_lock); | ||
256 | /* | ||
257 | * Check for race - another CPU could have allocated | ||
258 | * it meanwhile: | ||
259 | */ | ||
260 | if (*p_context) { | ||
261 | kfree(context->ds); | ||
262 | kfree(context); | ||
263 | return *p_context; | ||
264 | } | ||
265 | |||
250 | *p_context = context; | 266 | *p_context = context; |
251 | 267 | ||
252 | context->this = p_context; | 268 | context->this = p_context; |
@@ -384,14 +400,15 @@ static int ds_request(struct task_struct *task, void *base, size_t size, | |||
384 | 400 | ||
385 | spin_lock(&ds_lock); | 401 | spin_lock(&ds_lock); |
386 | 402 | ||
387 | if (!check_tracer(task)) | ||
388 | return -EPERM; | ||
389 | |||
390 | error = -ENOMEM; | 403 | error = -ENOMEM; |
391 | context = ds_alloc_context(task); | 404 | context = ds_alloc_context(task); |
392 | if (!context) | 405 | if (!context) |
393 | goto out_unlock; | 406 | goto out_unlock; |
394 | 407 | ||
408 | error = -EPERM; | ||
409 | if (!check_tracer(task)) | ||
410 | goto out_unlock; | ||
411 | |||
395 | error = -EALREADY; | 412 | error = -EALREADY; |
396 | if (context->owner[qual] == current) | 413 | if (context->owner[qual] == current) |
397 | goto out_unlock; | 414 | goto out_unlock; |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 28b597ef9ca1..74defe21ba42 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
@@ -1157,6 +1157,9 @@ ENTRY(mcount) | |||
1157 | END(mcount) | 1157 | END(mcount) |
1158 | 1158 | ||
1159 | ENTRY(ftrace_caller) | 1159 | ENTRY(ftrace_caller) |
1160 | cmpl $0, function_trace_stop | ||
1161 | jne ftrace_stub | ||
1162 | |||
1160 | pushl %eax | 1163 | pushl %eax |
1161 | pushl %ecx | 1164 | pushl %ecx |
1162 | pushl %edx | 1165 | pushl %edx |
@@ -1180,8 +1183,15 @@ END(ftrace_caller) | |||
1180 | #else /* ! CONFIG_DYNAMIC_FTRACE */ | 1183 | #else /* ! CONFIG_DYNAMIC_FTRACE */ |
1181 | 1184 | ||
1182 | ENTRY(mcount) | 1185 | ENTRY(mcount) |
1186 | cmpl $0, function_trace_stop | ||
1187 | jne ftrace_stub | ||
1188 | |||
1183 | cmpl $ftrace_stub, ftrace_trace_function | 1189 | cmpl $ftrace_stub, ftrace_trace_function |
1184 | jnz trace | 1190 | jnz trace |
1191 | #ifdef CONFIG_FUNCTION_RET_TRACER | ||
1192 | cmpl $ftrace_stub, ftrace_function_return | ||
1193 | jnz ftrace_return_caller | ||
1194 | #endif | ||
1185 | .globl ftrace_stub | 1195 | .globl ftrace_stub |
1186 | ftrace_stub: | 1196 | ftrace_stub: |
1187 | ret | 1197 | ret |
@@ -1200,12 +1210,42 @@ trace: | |||
1200 | popl %edx | 1210 | popl %edx |
1201 | popl %ecx | 1211 | popl %ecx |
1202 | popl %eax | 1212 | popl %eax |
1203 | |||
1204 | jmp ftrace_stub | 1213 | jmp ftrace_stub |
1205 | END(mcount) | 1214 | END(mcount) |
1206 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 1215 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
1207 | #endif /* CONFIG_FUNCTION_TRACER */ | 1216 | #endif /* CONFIG_FUNCTION_TRACER */ |
1208 | 1217 | ||
1218 | #ifdef CONFIG_FUNCTION_RET_TRACER | ||
1219 | ENTRY(ftrace_return_caller) | ||
1220 | cmpl $0, function_trace_stop | ||
1221 | jne ftrace_stub | ||
1222 | |||
1223 | pushl %eax | ||
1224 | pushl %ecx | ||
1225 | pushl %edx | ||
1226 | movl 0xc(%esp), %edx | ||
1227 | lea 0x4(%ebp), %eax | ||
1228 | call prepare_ftrace_return | ||
1229 | popl %edx | ||
1230 | popl %ecx | ||
1231 | popl %eax | ||
1232 | ret | ||
1233 | END(ftrace_return_caller) | ||
1234 | |||
1235 | .globl return_to_handler | ||
1236 | return_to_handler: | ||
1237 | pushl $0 | ||
1238 | pushl %eax | ||
1239 | pushl %ecx | ||
1240 | pushl %edx | ||
1241 | call ftrace_return_to_handler | ||
1242 | movl %eax, 0xc(%esp) | ||
1243 | popl %edx | ||
1244 | popl %ecx | ||
1245 | popl %eax | ||
1246 | ret | ||
1247 | #endif | ||
1248 | |||
1209 | .section .rodata,"a" | 1249 | .section .rodata,"a" |
1210 | #include "syscall_table_32.S" | 1250 | #include "syscall_table_32.S" |
1211 | 1251 | ||
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index b86f332c96a6..08aa6b10933c 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -68,6 +68,8 @@ ENTRY(mcount) | |||
68 | END(mcount) | 68 | END(mcount) |
69 | 69 | ||
70 | ENTRY(ftrace_caller) | 70 | ENTRY(ftrace_caller) |
71 | cmpl $0, function_trace_stop | ||
72 | jne ftrace_stub | ||
71 | 73 | ||
72 | /* taken from glibc */ | 74 | /* taken from glibc */ |
73 | subq $0x38, %rsp | 75 | subq $0x38, %rsp |
@@ -103,6 +105,9 @@ END(ftrace_caller) | |||
103 | 105 | ||
104 | #else /* ! CONFIG_DYNAMIC_FTRACE */ | 106 | #else /* ! CONFIG_DYNAMIC_FTRACE */ |
105 | ENTRY(mcount) | 107 | ENTRY(mcount) |
108 | cmpl $0, function_trace_stop | ||
109 | jne ftrace_stub | ||
110 | |||
106 | cmpq $ftrace_stub, ftrace_trace_function | 111 | cmpq $ftrace_stub, ftrace_trace_function |
107 | jnz trace | 112 | jnz trace |
108 | .globl ftrace_stub | 113 | .globl ftrace_stub |
diff --git a/arch/x86/kernel/es7000_32.c b/arch/x86/kernel/es7000_32.c index f454c78fcef6..0aa2c443d600 100644 --- a/arch/x86/kernel/es7000_32.c +++ b/arch/x86/kernel/es7000_32.c | |||
@@ -250,31 +250,24 @@ int __init find_unisys_acpi_oem_table(unsigned long *oem_addr) | |||
250 | { | 250 | { |
251 | struct acpi_table_header *header = NULL; | 251 | struct acpi_table_header *header = NULL; |
252 | int i = 0; | 252 | int i = 0; |
253 | acpi_size tbl_size; | ||
254 | 253 | ||
255 | while (ACPI_SUCCESS(acpi_get_table_with_size("OEM1", i++, &header, &tbl_size))) { | 254 | while (ACPI_SUCCESS(acpi_get_table("OEM1", i++, &header))) { |
256 | if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) { | 255 | if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) { |
257 | struct oem_table *t = (struct oem_table *)header; | 256 | struct oem_table *t = (struct oem_table *)header; |
258 | 257 | ||
259 | oem_addrX = t->OEMTableAddr; | 258 | oem_addrX = t->OEMTableAddr; |
260 | oem_size = t->OEMTableSize; | 259 | oem_size = t->OEMTableSize; |
261 | early_acpi_os_unmap_memory(header, tbl_size); | ||
262 | 260 | ||
263 | *oem_addr = (unsigned long)__acpi_map_table(oem_addrX, | 261 | *oem_addr = (unsigned long)__acpi_map_table(oem_addrX, |
264 | oem_size); | 262 | oem_size); |
265 | return 0; | 263 | return 0; |
266 | } | 264 | } |
267 | early_acpi_os_unmap_memory(header, tbl_size); | ||
268 | } | 265 | } |
269 | return -1; | 266 | return -1; |
270 | } | 267 | } |
271 | 268 | ||
272 | void __init unmap_unisys_acpi_oem_table(unsigned long oem_addr) | 269 | void __init unmap_unisys_acpi_oem_table(unsigned long oem_addr) |
273 | { | 270 | { |
274 | if (!oem_addr) | ||
275 | return; | ||
276 | |||
277 | __acpi_unmap_table((char *)oem_addr, oem_size); | ||
278 | } | 271 | } |
279 | #endif | 272 | #endif |
280 | 273 | ||
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index 50ea0ac8c9bf..356bb1eb6e9a 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c | |||
@@ -14,14 +14,17 @@ | |||
14 | #include <linux/uaccess.h> | 14 | #include <linux/uaccess.h> |
15 | #include <linux/ftrace.h> | 15 | #include <linux/ftrace.h> |
16 | #include <linux/percpu.h> | 16 | #include <linux/percpu.h> |
17 | #include <linux/sched.h> | ||
17 | #include <linux/init.h> | 18 | #include <linux/init.h> |
18 | #include <linux/list.h> | 19 | #include <linux/list.h> |
19 | 20 | ||
20 | #include <asm/ftrace.h> | 21 | #include <asm/ftrace.h> |
22 | #include <linux/ftrace.h> | ||
21 | #include <asm/nops.h> | 23 | #include <asm/nops.h> |
24 | #include <asm/nmi.h> | ||
22 | 25 | ||
23 | 26 | ||
24 | static unsigned char ftrace_nop[MCOUNT_INSN_SIZE]; | 27 | #ifdef CONFIG_DYNAMIC_FTRACE |
25 | 28 | ||
26 | union ftrace_code_union { | 29 | union ftrace_code_union { |
27 | char code[MCOUNT_INSN_SIZE]; | 30 | char code[MCOUNT_INSN_SIZE]; |
@@ -31,18 +34,12 @@ union ftrace_code_union { | |||
31 | } __attribute__((packed)); | 34 | } __attribute__((packed)); |
32 | }; | 35 | }; |
33 | 36 | ||
34 | |||
35 | static int ftrace_calc_offset(long ip, long addr) | 37 | static int ftrace_calc_offset(long ip, long addr) |
36 | { | 38 | { |
37 | return (int)(addr - ip); | 39 | return (int)(addr - ip); |
38 | } | 40 | } |
39 | 41 | ||
40 | unsigned char *ftrace_nop_replace(void) | 42 | static unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) |
41 | { | ||
42 | return ftrace_nop; | ||
43 | } | ||
44 | |||
45 | unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) | ||
46 | { | 43 | { |
47 | static union ftrace_code_union calc; | 44 | static union ftrace_code_union calc; |
48 | 45 | ||
@@ -56,7 +53,143 @@ unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) | |||
56 | return calc.code; | 53 | return calc.code; |
57 | } | 54 | } |
58 | 55 | ||
59 | int | 56 | /* |
57 | * Modifying code must take extra care. On an SMP machine, if | ||
58 | * the code being modified is also being executed on another CPU | ||
59 | * that CPU will have undefined results and possibly take a GPF. | ||
60 | * We use kstop_machine to stop other CPUS from exectuing code. | ||
61 | * But this does not stop NMIs from happening. We still need | ||
62 | * to protect against that. We separate out the modification of | ||
63 | * the code to take care of this. | ||
64 | * | ||
65 | * Two buffers are added: An IP buffer and a "code" buffer. | ||
66 | * | ||
67 | * 1) Put the instruction pointer into the IP buffer | ||
68 | * and the new code into the "code" buffer. | ||
69 | * 2) Set a flag that says we are modifying code | ||
70 | * 3) Wait for any running NMIs to finish. | ||
71 | * 4) Write the code | ||
72 | * 5) clear the flag. | ||
73 | * 6) Wait for any running NMIs to finish. | ||
74 | * | ||
75 | * If an NMI is executed, the first thing it does is to call | ||
76 | * "ftrace_nmi_enter". This will check if the flag is set to write | ||
77 | * and if it is, it will write what is in the IP and "code" buffers. | ||
78 | * | ||
79 | * The trick is, it does not matter if everyone is writing the same | ||
80 | * content to the code location. Also, if a CPU is executing code | ||
81 | * it is OK to write to that code location if the contents being written | ||
82 | * are the same as what exists. | ||
83 | */ | ||
84 | |||
85 | static atomic_t in_nmi = ATOMIC_INIT(0); | ||
86 | static int mod_code_status; /* holds return value of text write */ | ||
87 | static int mod_code_write; /* set when NMI should do the write */ | ||
88 | static void *mod_code_ip; /* holds the IP to write to */ | ||
89 | static void *mod_code_newcode; /* holds the text to write to the IP */ | ||
90 | |||
91 | static unsigned nmi_wait_count; | ||
92 | static atomic_t nmi_update_count = ATOMIC_INIT(0); | ||
93 | |||
94 | int ftrace_arch_read_dyn_info(char *buf, int size) | ||
95 | { | ||
96 | int r; | ||
97 | |||
98 | r = snprintf(buf, size, "%u %u", | ||
99 | nmi_wait_count, | ||
100 | atomic_read(&nmi_update_count)); | ||
101 | return r; | ||
102 | } | ||
103 | |||
104 | static void ftrace_mod_code(void) | ||
105 | { | ||
106 | /* | ||
107 | * Yes, more than one CPU process can be writing to mod_code_status. | ||
108 | * (and the code itself) | ||
109 | * But if one were to fail, then they all should, and if one were | ||
110 | * to succeed, then they all should. | ||
111 | */ | ||
112 | mod_code_status = probe_kernel_write(mod_code_ip, mod_code_newcode, | ||
113 | MCOUNT_INSN_SIZE); | ||
114 | |||
115 | } | ||
116 | |||
117 | void ftrace_nmi_enter(void) | ||
118 | { | ||
119 | atomic_inc(&in_nmi); | ||
120 | /* Must have in_nmi seen before reading write flag */ | ||
121 | smp_mb(); | ||
122 | if (mod_code_write) { | ||
123 | ftrace_mod_code(); | ||
124 | atomic_inc(&nmi_update_count); | ||
125 | } | ||
126 | } | ||
127 | |||
128 | void ftrace_nmi_exit(void) | ||
129 | { | ||
130 | /* Finish all executions before clearing in_nmi */ | ||
131 | smp_wmb(); | ||
132 | atomic_dec(&in_nmi); | ||
133 | } | ||
134 | |||
135 | static void wait_for_nmi(void) | ||
136 | { | ||
137 | int waited = 0; | ||
138 | |||
139 | while (atomic_read(&in_nmi)) { | ||
140 | waited = 1; | ||
141 | cpu_relax(); | ||
142 | } | ||
143 | |||
144 | if (waited) | ||
145 | nmi_wait_count++; | ||
146 | } | ||
147 | |||
148 | static int | ||
149 | do_ftrace_mod_code(unsigned long ip, void *new_code) | ||
150 | { | ||
151 | mod_code_ip = (void *)ip; | ||
152 | mod_code_newcode = new_code; | ||
153 | |||
154 | /* The buffers need to be visible before we let NMIs write them */ | ||
155 | smp_wmb(); | ||
156 | |||
157 | mod_code_write = 1; | ||
158 | |||
159 | /* Make sure write bit is visible before we wait on NMIs */ | ||
160 | smp_mb(); | ||
161 | |||
162 | wait_for_nmi(); | ||
163 | |||
164 | /* Make sure all running NMIs have finished before we write the code */ | ||
165 | smp_mb(); | ||
166 | |||
167 | ftrace_mod_code(); | ||
168 | |||
169 | /* Make sure the write happens before clearing the bit */ | ||
170 | smp_wmb(); | ||
171 | |||
172 | mod_code_write = 0; | ||
173 | |||
174 | /* make sure NMIs see the cleared bit */ | ||
175 | smp_mb(); | ||
176 | |||
177 | wait_for_nmi(); | ||
178 | |||
179 | return mod_code_status; | ||
180 | } | ||
181 | |||
182 | |||
183 | |||
184 | |||
185 | static unsigned char ftrace_nop[MCOUNT_INSN_SIZE]; | ||
186 | |||
187 | static unsigned char *ftrace_nop_replace(void) | ||
188 | { | ||
189 | return ftrace_nop; | ||
190 | } | ||
191 | |||
192 | static int | ||
60 | ftrace_modify_code(unsigned long ip, unsigned char *old_code, | 193 | ftrace_modify_code(unsigned long ip, unsigned char *old_code, |
61 | unsigned char *new_code) | 194 | unsigned char *new_code) |
62 | { | 195 | { |
@@ -81,7 +214,7 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code, | |||
81 | return -EINVAL; | 214 | return -EINVAL; |
82 | 215 | ||
83 | /* replace the text with the new text */ | 216 | /* replace the text with the new text */ |
84 | if (probe_kernel_write((void *)ip, new_code, MCOUNT_INSN_SIZE)) | 217 | if (do_ftrace_mod_code(ip, new_code)) |
85 | return -EPERM; | 218 | return -EPERM; |
86 | 219 | ||
87 | sync_core(); | 220 | sync_core(); |
@@ -89,6 +222,29 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code, | |||
89 | return 0; | 222 | return 0; |
90 | } | 223 | } |
91 | 224 | ||
225 | int ftrace_make_nop(struct module *mod, | ||
226 | struct dyn_ftrace *rec, unsigned long addr) | ||
227 | { | ||
228 | unsigned char *new, *old; | ||
229 | unsigned long ip = rec->ip; | ||
230 | |||
231 | old = ftrace_call_replace(ip, addr); | ||
232 | new = ftrace_nop_replace(); | ||
233 | |||
234 | return ftrace_modify_code(rec->ip, old, new); | ||
235 | } | ||
236 | |||
237 | int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) | ||
238 | { | ||
239 | unsigned char *new, *old; | ||
240 | unsigned long ip = rec->ip; | ||
241 | |||
242 | old = ftrace_nop_replace(); | ||
243 | new = ftrace_call_replace(ip, addr); | ||
244 | |||
245 | return ftrace_modify_code(rec->ip, old, new); | ||
246 | } | ||
247 | |||
92 | int ftrace_update_ftrace_func(ftrace_func_t func) | 248 | int ftrace_update_ftrace_func(ftrace_func_t func) |
93 | { | 249 | { |
94 | unsigned long ip = (unsigned long)(&ftrace_call); | 250 | unsigned long ip = (unsigned long)(&ftrace_call); |
@@ -165,3 +321,138 @@ int __init ftrace_dyn_arch_init(void *data) | |||
165 | 321 | ||
166 | return 0; | 322 | return 0; |
167 | } | 323 | } |
324 | #endif | ||
325 | |||
326 | #ifdef CONFIG_FUNCTION_RET_TRACER | ||
327 | |||
328 | #ifndef CONFIG_DYNAMIC_FTRACE | ||
329 | |||
330 | /* | ||
331 | * These functions are picked from those used on | ||
332 | * this page for dynamic ftrace. They have been | ||
333 | * simplified to ignore all traces in NMI context. | ||
334 | */ | ||
335 | static atomic_t in_nmi; | ||
336 | |||
337 | void ftrace_nmi_enter(void) | ||
338 | { | ||
339 | atomic_inc(&in_nmi); | ||
340 | } | ||
341 | |||
342 | void ftrace_nmi_exit(void) | ||
343 | { | ||
344 | atomic_dec(&in_nmi); | ||
345 | } | ||
346 | #endif /* !CONFIG_DYNAMIC_FTRACE */ | ||
347 | |||
348 | /* Add a function return address to the trace stack on thread info.*/ | ||
349 | static int push_return_trace(unsigned long ret, unsigned long long time, | ||
350 | unsigned long func) | ||
351 | { | ||
352 | int index; | ||
353 | struct thread_info *ti = current_thread_info(); | ||
354 | |||
355 | /* The return trace stack is full */ | ||
356 | if (ti->curr_ret_stack == FTRACE_RET_STACK_SIZE - 1) { | ||
357 | atomic_inc(&ti->trace_overrun); | ||
358 | return -EBUSY; | ||
359 | } | ||
360 | |||
361 | index = ++ti->curr_ret_stack; | ||
362 | barrier(); | ||
363 | ti->ret_stack[index].ret = ret; | ||
364 | ti->ret_stack[index].func = func; | ||
365 | ti->ret_stack[index].calltime = time; | ||
366 | |||
367 | return 0; | ||
368 | } | ||
369 | |||
370 | /* Retrieve a function return address to the trace stack on thread info.*/ | ||
371 | static void pop_return_trace(unsigned long *ret, unsigned long long *time, | ||
372 | unsigned long *func, unsigned long *overrun) | ||
373 | { | ||
374 | int index; | ||
375 | |||
376 | struct thread_info *ti = current_thread_info(); | ||
377 | index = ti->curr_ret_stack; | ||
378 | *ret = ti->ret_stack[index].ret; | ||
379 | *func = ti->ret_stack[index].func; | ||
380 | *time = ti->ret_stack[index].calltime; | ||
381 | *overrun = atomic_read(&ti->trace_overrun); | ||
382 | ti->curr_ret_stack--; | ||
383 | } | ||
384 | |||
385 | /* | ||
386 | * Send the trace to the ring-buffer. | ||
387 | * @return the original return address. | ||
388 | */ | ||
389 | unsigned long ftrace_return_to_handler(void) | ||
390 | { | ||
391 | struct ftrace_retfunc trace; | ||
392 | pop_return_trace(&trace.ret, &trace.calltime, &trace.func, | ||
393 | &trace.overrun); | ||
394 | trace.rettime = cpu_clock(raw_smp_processor_id()); | ||
395 | ftrace_function_return(&trace); | ||
396 | |||
397 | return trace.ret; | ||
398 | } | ||
399 | |||
400 | /* | ||
401 | * Hook the return address and push it in the stack of return addrs | ||
402 | * in current thread info. | ||
403 | */ | ||
404 | void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) | ||
405 | { | ||
406 | unsigned long old; | ||
407 | unsigned long long calltime; | ||
408 | int faulted; | ||
409 | unsigned long return_hooker = (unsigned long) | ||
410 | &return_to_handler; | ||
411 | |||
412 | /* Nmi's are currently unsupported */ | ||
413 | if (atomic_read(&in_nmi)) | ||
414 | return; | ||
415 | |||
416 | /* | ||
417 | * Protect against fault, even if it shouldn't | ||
418 | * happen. This tool is too much intrusive to | ||
419 | * ignore such a protection. | ||
420 | */ | ||
421 | asm volatile( | ||
422 | "1: movl (%[parent_old]), %[old]\n" | ||
423 | "2: movl %[return_hooker], (%[parent_replaced])\n" | ||
424 | " movl $0, %[faulted]\n" | ||
425 | |||
426 | ".section .fixup, \"ax\"\n" | ||
427 | "3: movl $1, %[faulted]\n" | ||
428 | ".previous\n" | ||
429 | |||
430 | ".section __ex_table, \"a\"\n" | ||
431 | " .long 1b, 3b\n" | ||
432 | " .long 2b, 3b\n" | ||
433 | ".previous\n" | ||
434 | |||
435 | : [parent_replaced] "=r" (parent), [old] "=r" (old), | ||
436 | [faulted] "=r" (faulted) | ||
437 | : [parent_old] "0" (parent), [return_hooker] "r" (return_hooker) | ||
438 | : "memory" | ||
439 | ); | ||
440 | |||
441 | if (WARN_ON(faulted)) { | ||
442 | unregister_ftrace_return(); | ||
443 | return; | ||
444 | } | ||
445 | |||
446 | if (WARN_ON(!__kernel_text_address(old))) { | ||
447 | unregister_ftrace_return(); | ||
448 | *parent = old; | ||
449 | return; | ||
450 | } | ||
451 | |||
452 | calltime = cpu_clock(raw_smp_processor_id()); | ||
453 | |||
454 | if (push_return_trace(old, calltime, self_addr) == -EBUSY) | ||
455 | *parent = old; | ||
456 | } | ||
457 | |||
458 | #endif /* CONFIG_FUNCTION_RET_TRACER */ | ||
diff --git a/arch/x86/kernel/io_apic.c b/arch/x86/kernel/io_apic.c index 7a3f2028e2eb..c9513e1ff28d 100644 --- a/arch/x86/kernel/io_apic.c +++ b/arch/x86/kernel/io_apic.c | |||
@@ -1140,6 +1140,20 @@ static void __clear_irq_vector(int irq) | |||
1140 | 1140 | ||
1141 | cfg->vector = 0; | 1141 | cfg->vector = 0; |
1142 | cpus_clear(cfg->domain); | 1142 | cpus_clear(cfg->domain); |
1143 | |||
1144 | if (likely(!cfg->move_in_progress)) | ||
1145 | return; | ||
1146 | cpus_and(mask, cfg->old_domain, cpu_online_map); | ||
1147 | for_each_cpu_mask_nr(cpu, mask) { | ||
1148 | for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; | ||
1149 | vector++) { | ||
1150 | if (per_cpu(vector_irq, cpu)[vector] != irq) | ||
1151 | continue; | ||
1152 | per_cpu(vector_irq, cpu)[vector] = -1; | ||
1153 | break; | ||
1154 | } | ||
1155 | } | ||
1156 | cfg->move_in_progress = 0; | ||
1143 | } | 1157 | } |
1144 | 1158 | ||
1145 | void __setup_vector_irq(int cpu) | 1159 | void __setup_vector_irq(int cpu) |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 724adfc63cb9..cc5a2545dd41 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
@@ -169,6 +169,15 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { | |||
169 | DMI_MATCH(DMI_BOARD_NAME, "0KW626"), | 169 | DMI_MATCH(DMI_BOARD_NAME, "0KW626"), |
170 | }, | 170 | }, |
171 | }, | 171 | }, |
172 | { /* Handle problems with rebooting on Dell Optiplex 330 with 0KP561 */ | ||
173 | .callback = set_bios_reboot, | ||
174 | .ident = "Dell OptiPlex 330", | ||
175 | .matches = { | ||
176 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
177 | DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 330"), | ||
178 | DMI_MATCH(DMI_BOARD_NAME, "0KP561"), | ||
179 | }, | ||
180 | }, | ||
172 | { /* Handle problems with rebooting on Dell 2400's */ | 181 | { /* Handle problems with rebooting on Dell 2400's */ |
173 | .callback = set_bios_reboot, | 182 | .callback = set_bios_reboot, |
174 | .ident = "Dell PowerEdge 2400", | 183 | .ident = "Dell PowerEdge 2400", |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 0fa6790c1dd3..9d5674f7b6cc 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -764,7 +764,7 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = { | |||
764 | .callback = dmi_low_memory_corruption, | 764 | .callback = dmi_low_memory_corruption, |
765 | .ident = "Phoenix BIOS", | 765 | .ident = "Phoenix BIOS", |
766 | .matches = { | 766 | .matches = { |
767 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"), | 767 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"), |
768 | }, | 768 | }, |
769 | }, | 769 | }, |
770 | #endif | 770 | #endif |
diff --git a/arch/x86/kernel/tsc_sync.c b/arch/x86/kernel/tsc_sync.c index 9ffb01c31c40..1c0dfbca87c1 100644 --- a/arch/x86/kernel/tsc_sync.c +++ b/arch/x86/kernel/tsc_sync.c | |||
@@ -46,7 +46,9 @@ static __cpuinit void check_tsc_warp(void) | |||
46 | cycles_t start, now, prev, end; | 46 | cycles_t start, now, prev, end; |
47 | int i; | 47 | int i; |
48 | 48 | ||
49 | rdtsc_barrier(); | ||
49 | start = get_cycles(); | 50 | start = get_cycles(); |
51 | rdtsc_barrier(); | ||
50 | /* | 52 | /* |
51 | * The measurement runs for 20 msecs: | 53 | * The measurement runs for 20 msecs: |
52 | */ | 54 | */ |
@@ -61,7 +63,9 @@ static __cpuinit void check_tsc_warp(void) | |||
61 | */ | 63 | */ |
62 | __raw_spin_lock(&sync_lock); | 64 | __raw_spin_lock(&sync_lock); |
63 | prev = last_tsc; | 65 | prev = last_tsc; |
66 | rdtsc_barrier(); | ||
64 | now = get_cycles(); | 67 | now = get_cycles(); |
68 | rdtsc_barrier(); | ||
65 | last_tsc = now; | 69 | last_tsc = now; |
66 | __raw_spin_unlock(&sync_lock); | 70 | __raw_spin_unlock(&sync_lock); |
67 | 71 | ||
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c index 0b8b6690a86d..6f3d3d4cd973 100644 --- a/arch/x86/kernel/vsyscall_64.c +++ b/arch/x86/kernel/vsyscall_64.c | |||
@@ -17,6 +17,9 @@ | |||
17 | * want per guest time just set the kernel.vsyscall64 sysctl to 0. | 17 | * want per guest time just set the kernel.vsyscall64 sysctl to 0. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | /* Disable profiling for userspace code: */ | ||
21 | #define DISABLE_BRANCH_PROFILING | ||
22 | |||
20 | #include <linux/time.h> | 23 | #include <linux/time.h> |
21 | #include <linux/init.h> | 24 | #include <linux/init.h> |
22 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
diff --git a/arch/x86/mach-voyager/voyager_smp.c b/arch/x86/mach-voyager/voyager_smp.c index 0e331652681e..52145007bd7e 100644 --- a/arch/x86/mach-voyager/voyager_smp.c +++ b/arch/x86/mach-voyager/voyager_smp.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * This file provides all the same external entries as smp.c but uses | 7 | * This file provides all the same external entries as smp.c but uses |
8 | * the voyager hal to provide the functionality | 8 | * the voyager hal to provide the functionality |
9 | */ | 9 | */ |
10 | #include <linux/cpu.h> | ||
10 | #include <linux/module.h> | 11 | #include <linux/module.h> |
11 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
12 | #include <linux/kernel_stat.h> | 13 | #include <linux/kernel_stat.h> |
@@ -1790,6 +1791,17 @@ void __init smp_setup_processor_id(void) | |||
1790 | x86_write_percpu(cpu_number, hard_smp_processor_id()); | 1791 | x86_write_percpu(cpu_number, hard_smp_processor_id()); |
1791 | } | 1792 | } |
1792 | 1793 | ||
1794 | static void voyager_send_call_func(cpumask_t callmask) | ||
1795 | { | ||
1796 | __u32 mask = cpus_addr(callmask)[0] & ~(1 << smp_processor_id()); | ||
1797 | send_CPI(mask, VIC_CALL_FUNCTION_CPI); | ||
1798 | } | ||
1799 | |||
1800 | static void voyager_send_call_func_single(int cpu) | ||
1801 | { | ||
1802 | send_CPI(1 << cpu, VIC_CALL_FUNCTION_SINGLE_CPI); | ||
1803 | } | ||
1804 | |||
1793 | struct smp_ops smp_ops = { | 1805 | struct smp_ops smp_ops = { |
1794 | .smp_prepare_boot_cpu = voyager_smp_prepare_boot_cpu, | 1806 | .smp_prepare_boot_cpu = voyager_smp_prepare_boot_cpu, |
1795 | .smp_prepare_cpus = voyager_smp_prepare_cpus, | 1807 | .smp_prepare_cpus = voyager_smp_prepare_cpus, |
@@ -1799,6 +1811,6 @@ struct smp_ops smp_ops = { | |||
1799 | .smp_send_stop = voyager_smp_send_stop, | 1811 | .smp_send_stop = voyager_smp_send_stop, |
1800 | .smp_send_reschedule = voyager_smp_send_reschedule, | 1812 | .smp_send_reschedule = voyager_smp_send_reschedule, |
1801 | 1813 | ||
1802 | .send_call_func_ipi = native_send_call_func_ipi, | 1814 | .send_call_func_ipi = voyager_send_call_func, |
1803 | .send_call_func_single_ipi = native_send_call_func_single_ipi, | 1815 | .send_call_func_single_ipi = voyager_send_call_func_single, |
1804 | }; | 1816 | }; |
diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile index fea4565ff576..d8cc96a2738f 100644 --- a/arch/x86/mm/Makefile +++ b/arch/x86/mm/Makefile | |||
@@ -8,9 +8,8 @@ obj-$(CONFIG_X86_PTDUMP) += dump_pagetables.o | |||
8 | 8 | ||
9 | obj-$(CONFIG_HIGHMEM) += highmem_32.o | 9 | obj-$(CONFIG_HIGHMEM) += highmem_32.o |
10 | 10 | ||
11 | obj-$(CONFIG_MMIOTRACE_HOOKS) += kmmio.o | ||
12 | obj-$(CONFIG_MMIOTRACE) += mmiotrace.o | 11 | obj-$(CONFIG_MMIOTRACE) += mmiotrace.o |
13 | mmiotrace-y := pf_in.o mmio-mod.o | 12 | mmiotrace-y := kmmio.o pf_in.o mmio-mod.o |
14 | obj-$(CONFIG_MMIOTRACE_TEST) += testmmiotrace.o | 13 | obj-$(CONFIG_MMIOTRACE_TEST) += testmmiotrace.o |
15 | 14 | ||
16 | obj-$(CONFIG_NUMA) += numa_$(BITS).o | 15 | obj-$(CONFIG_NUMA) += numa_$(BITS).o |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 31e8730fa246..4152d3c3b138 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
@@ -53,7 +53,7 @@ | |||
53 | 53 | ||
54 | static inline int kmmio_fault(struct pt_regs *regs, unsigned long addr) | 54 | static inline int kmmio_fault(struct pt_regs *regs, unsigned long addr) |
55 | { | 55 | { |
56 | #ifdef CONFIG_MMIOTRACE_HOOKS | 56 | #ifdef CONFIG_MMIOTRACE |
57 | if (unlikely(is_kmmio_active())) | 57 | if (unlikely(is_kmmio_active())) |
58 | if (kmmio_handler(regs, addr) == 1) | 58 | if (kmmio_handler(regs, addr) == 1) |
59 | return -1; | 59 | return -1; |
diff --git a/arch/x86/mm/numa_32.c b/arch/x86/mm/numa_32.c index 847c164725f4..8518c678d83f 100644 --- a/arch/x86/mm/numa_32.c +++ b/arch/x86/mm/numa_32.c | |||
@@ -222,6 +222,41 @@ static void __init remap_numa_kva(void) | |||
222 | } | 222 | } |
223 | } | 223 | } |
224 | 224 | ||
225 | #ifdef CONFIG_HIBERNATION | ||
226 | /** | ||
227 | * resume_map_numa_kva - add KVA mapping to the temporary page tables created | ||
228 | * during resume from hibernation | ||
229 | * @pgd_base - temporary resume page directory | ||
230 | */ | ||
231 | void resume_map_numa_kva(pgd_t *pgd_base) | ||
232 | { | ||
233 | int node; | ||
234 | |||
235 | for_each_online_node(node) { | ||
236 | unsigned long start_va, start_pfn, size, pfn; | ||
237 | |||
238 | start_va = (unsigned long)node_remap_start_vaddr[node]; | ||
239 | start_pfn = node_remap_start_pfn[node]; | ||
240 | size = node_remap_size[node]; | ||
241 | |||
242 | printk(KERN_DEBUG "%s: node %d\n", __FUNCTION__, node); | ||
243 | |||
244 | for (pfn = 0; pfn < size; pfn += PTRS_PER_PTE) { | ||
245 | unsigned long vaddr = start_va + (pfn << PAGE_SHIFT); | ||
246 | pgd_t *pgd = pgd_base + pgd_index(vaddr); | ||
247 | pud_t *pud = pud_offset(pgd, vaddr); | ||
248 | pmd_t *pmd = pmd_offset(pud, vaddr); | ||
249 | |||
250 | set_pmd(pmd, pfn_pmd(start_pfn + pfn, | ||
251 | PAGE_KERNEL_LARGE_EXEC)); | ||
252 | |||
253 | printk(KERN_DEBUG "%s: %08lx -> pfn %08lx\n", | ||
254 | __FUNCTION__, vaddr, start_pfn + pfn); | ||
255 | } | ||
256 | } | ||
257 | } | ||
258 | #endif | ||
259 | |||
225 | static unsigned long calculate_numa_remap_pages(void) | 260 | static unsigned long calculate_numa_remap_pages(void) |
226 | { | 261 | { |
227 | int nid; | 262 | int nid; |
diff --git a/arch/x86/power/hibernate_32.c b/arch/x86/power/hibernate_32.c index f2b6e3f11bfc..81197c62d5b3 100644 --- a/arch/x86/power/hibernate_32.c +++ b/arch/x86/power/hibernate_32.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <asm/system.h> | 12 | #include <asm/system.h> |
13 | #include <asm/page.h> | 13 | #include <asm/page.h> |
14 | #include <asm/pgtable.h> | 14 | #include <asm/pgtable.h> |
15 | #include <asm/mmzone.h> | ||
15 | 16 | ||
16 | /* Defined in hibernate_asm_32.S */ | 17 | /* Defined in hibernate_asm_32.S */ |
17 | extern int restore_image(void); | 18 | extern int restore_image(void); |
@@ -127,6 +128,9 @@ static int resume_physical_mapping_init(pgd_t *pgd_base) | |||
127 | } | 128 | } |
128 | } | 129 | } |
129 | } | 130 | } |
131 | |||
132 | resume_map_numa_kva(pgd_base); | ||
133 | |||
130 | return 0; | 134 | return 0; |
131 | } | 135 | } |
132 | 136 | ||
diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c index 1ef0f90813d6..d9d35824c56f 100644 --- a/arch/x86/vdso/vclock_gettime.c +++ b/arch/x86/vdso/vclock_gettime.c | |||
@@ -9,6 +9,9 @@ | |||
9 | * Also alternative() doesn't work. | 9 | * Also alternative() doesn't work. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | /* Disable profiling for userspace code: */ | ||
13 | #define DISABLE_BRANCH_PROFILING | ||
14 | |||
12 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
13 | #include <linux/posix-timers.h> | 16 | #include <linux/posix-timers.h> |
14 | #include <linux/time.h> | 17 | #include <linux/time.h> |